Javaでローカルファイルがファイルかディレクトリかを調べるには、FileクラスのisFileやisDirectoryを使えばいい。
このページではそれぞれの基本的な使い方と、サンプルプログラムを用意してみた。使い方の参考にしてほしい。
目次
Javaのファイルとディレクトリの調べ方
調べるためのメソッド
Fileクラスは、ファイルとディレクトリの両方を抽象パス名で扱っている。区別されてないのだ。
このため、コードを見ただけでは分からない場合がある。こんなときのために、ファイルかディレクトリかを調べるためのメソッドが用意されている。
ファイルとディレクトリは違う
Fileクラスにはファイルもディレクトリも同じように扱うことのできる共通メソッドがある。しかし、対象がファイルかディレクトリによって、メソッドに違いがある。
例えば、削除だ。ファイルは中身が空でなくても削除できるが、ディレクトリは中身が空の時だけ削除できる。
listメソッドなども抽象パスがディレクトリをでなければならない。その他にもあるので、注意してほしい。
メソッド
ファイルかディレクトリかを調べるために用意されているふたつのメソッドの詳細を見てみよう。
ファイルか調べるisFile()
ファイルかを調べるのはisFileメソッドだ。
isFile()
戻り値の型 |
public boolean |
内容 |
抽象パス名によって示されたファイルが、普通のファイルかどうかを調べる。ファイルがディレクトリでなくて、システムに依存する基準を満たしていれば、普通のファイルである。Javaアプリケーションによって作られたどんなディレクトリでないファイルは、普通のファイルであることが保証されている。 ファイルが普通のファイルでないことをI/O例外と区別したい場合や、同じファイルのいくつかの属性が同時に要求される場合は、Files.readAttributesメソッドが使用できるかもしれない。 戻り値:true - 抽象パス名で示されたファイルが存在し、かつ普通のファイルであるならば。false – それ以外。 SecurityException – もし、セキュリティマネジャーが存在して、itsSecurityManager.checkRead(java.lang.String)メソッドがそのファイルかディレクトリの読み込み・アクセスを拒否したならば。 |
ディレクトリかを調べるisDirectory()
ディレクトリかを調べるにはisDirectoryメソッドを使う。
isDirectory()
戻り値の型 |
public boolean |
内容 |
抽象パス名によって示されたファイルが、ディレクトリかどうかを調べる。 ファイルがディレクトリでないことをI/O例外と区別したい場合や、同じファイルのいくつかの属性が同時に要求される場合は、Files.readAttributesメソッドが使用できるかもしれない。 戻り値:true - 抽象パス名で示されたファイルが存在し、かつディレクトリであるならば。false – それ以外。 SecurityException – もし、セキュリティマネジャーが存在して、itsSecurityManager.checkRead(java.lang.String)メソッドがそのファイルかディレクトリの読み込み・アクセスを拒否したならば。 |
ディレクトリの内容を調べる
また、listFiles()を使うと、名前の一覧を取得するのではなく、ディレクトリに含まれるファイルやディレクトリを一覧として取得できる。
listFiles()
戻り値の型 |
public File[] |
内容 |
抽象パス名で示されたディレクトリ内のファイル群を表す抽象パス名の配列を戻す。 もし、この抽象パス名がディレクトリを示していないなら、このメソッドはnullを返す。そうでなければ、Fileオブジェクトの配列が戻される。そして、それらの要素のひとつひとつがディレクトリ内の各々のファイルかディレクトリに対応している。ディレクトリそのものを示しているパス名とディレクトリの親ディレクトリは結果に含まれない。各々の結果としての抽象パス名は、File(File, String)コンストラクタを使用して生成される。従って、もしこのパス名が絶対であれば、各々の結果としてのパス名も絶対となる。もしこのパス名が相対であれば、各々の結果としてのパス名も同じディレクトリの相対となる。 結果としての配列中の名前文字列が何らかの仕様に基づく順序となることは保証されていない。つまり、特にアルファベット順になるということは保証されていない。 考慮点:Filesクラスは、ディレクトリやディレクトリ内のファイル群を繰り返し操作するためにnewDirectoryStreamメソッドを定義している。これは、大きなディレクトリを操作する場合に、資源を節約するかもしれない。
戻り値:抽象パス名で示されたディレクトリ内のファイル群を表す抽象パス名の配列を戻す。ディレクトリが空であれば、配列も空である。もし、この抽象パス名がディレクトリを表現していないならば、nullを戻す。
SecurityException – もし、セキュリティマネジャーが存在して、itsSecurityManager.checkRead(java.lang.String)メソッドがそのファイルかディレクトリの読み込み・アクセスを拒否したならば。
以降:1.2 |
ディレクトリ内を調べるサンプルプログラム
それでは実際にサンプルプログラムを確認してみよう。
WindowsのC:ドライブのディレクトリ:C:\temp\abcに以下のようなファイルやフォルダがある。このとき、プログラムはディレクトリに含まれている内容を調べ、すべての内容物についてファイルなのか、それともディレクトリかを表示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.io.File; public class TestWhetherFileOrDirectory { public static void main(String[] args) { String pathname = "C:\\temp\\abc";//[1] File file = new File(pathname);//[2] File[] files = file.listFiles();//[3] for (int index = 0; index < files.length; index ++) {//[4] File item = files[index];//[5] if (item.isDirectory()) {//[6] System.out.println("[7][" + item.getName() + "]はディレクトリです"); continue;//[8] } if (item.isFile()) {//[9] System.out.println("[10][" + item.getName() + "]はファイルです"); continue;//[11] } System.out.println("[12][" + pathname + "]はディレクトリでもファイルでもありません"); } } } |
実行結果
1 2 3 4 |
[7] [Directory001]はディレクトリです [7] [Directory002]はディレクトリです [10] [File001.txt]はファイルです [10] [File002.txt]はファイルです |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 文字列pathnameにディレクトリのパスと名前を設定する。
- [2] Fileクラスからpathnameをパス名に持つfileインスタンスを生成する。
- [3] ディレクトリの内容を配列:filesとして取得する。
- [4] 配列:filesに含まれる要素の数だけループを繰り返す。
- [5] 配列の要素を取り出す。
- [6] 配列の要素がディレクトリかを調べる。
- [7] 要素がディレクトリであることを表示する。
- [8] ループの先頭に戻る。
- [9] 配列の要素がファイルかを調べる。
- [10] 要素がファイルであることを表示する。
- [11] ループの先頭に戻る。
- [12] ファイルでもディレクトリでもないことを表示する。
ディレクトリを削除するサンプルプログラム
ディレクトリを削除しようとしても、空でないディレクトリは削除できない。
この問題を解決するために、このプログラムはディレクトリが空であることを調べてから、削除を行っている。
現実のプログラムでは、さらに抽象パス名がディレクトリかを調べてることも必要になるが、ここではシンプルにするために省いている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.io.File; public class DirectoryDelete { public static void main(String[] args) { String pathname = "C:\\temp\\abx";//[1] File file = new File(pathname);//[2] File[] files = file.listFiles();//[3] if (files.length > 0) {//[4] System.out.println("[10]ディレクトリ:[" + pathname + "]は空でないので、削除できません"); return;//[8] } if (file.delete()) {//[7] System.out.println("[8]ファイル:[" + pathname + "]の削除に成功しました"); return;//[9] } System.out.println("[10]ファイル:[" + pathname + "]の削除に失敗しました"); } } |
実行結果
1 2 3 4 5 6 |
条件1:ディレクトリ:C:\temp\abcが空でない。 [5]ディレクトリ:[C:\temp\abc]は空でないので、削除できません 条件2:ディレクトリ:C:\temp\abcが空である。 [8]ファイル:[C:\temp\abc]の削除に成功しました 条件3:ディレクトリ:C:\temp\abcにコマンドプロンプトを移動する。 [10]ファイル:[C:\temp\abc]の削除に失敗しました |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 文字列pathnameにディレクトリのパスと名前を設定する。
- [2] Fileクラスからpathnameをパス名に持つfileインスタンスを生成する。
- [3] ディレクトリの内容を配列:filesとして取得する。
- [4] 配列:filesの要素数が0以上かを調べる。
- [5] 要素数が0以上であるなら、ディレクトリが空でないので削除できないことを表示する。
- [6] プログラムを終了する。
- [7] deleteメソッドにより、ファイルの削除を行う。
- [8] ファイルの削除が成功したことを表示する。
- [9] プログラムを終了する。
- [10] ファイルの削除が失敗したことを表示する。
まとめ
このページではJavaでファイルやディレクトリを判別する方法についてお伝えした。
Fileクラスには色々なメソッドがあるが、isFileやisDirectoryも覚えておいていいメソッドだ。サンプルプログラムを動かして確認していただければと思う。