Javaでファイル操作に使用するFileクラスにはさまざまな機能があります。
この記事では、ファイル操作で必要な、
・ファイルを一覧化する方法
・フィルタを使用して一覧化する方法
という基本的な内容から、
・指定文字列でファイルをフィルタリングする
・拡張子を指定してファイルをフィルタリングする
などの応用的な使い方に関しても解説していきます。
今回はそんなファイルをフィルタリングする方法について、さまざまな方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
ファイルの一覧を取得する方法
指定したディレクトリに存在するファイルを一覧化するためには、FileクラスのlistFilesメソッドを使用します。
listFilesメソッドは、ファイルの配列を定義して使用します。listFilesは配列の要素に存在するファイル名が格納されます。
public File[] listFiles()
以下にlistFilesメソッドを使用した、ファイルの一覧を取得する方法を記述します。
public class fileClass{ public fileClass() throws IOException{ File dir = new File("/Users/Shared/java"); //ファイルの一覧を取得する File[] filename = dir.listFiles(); //結果を出力する for(int i=0; i<filename.length; ++i){ System.out.println("file name : " + filename[i]); } } }
実行結果 file name : /Users/Shared/java/java.csv file name : /Users/Shared/java/java.txt file name : /Users/Shared/java/java1.txt file name : /Users/Shared/java/java2.txt 〜
ファイルの一覧を取得するためには、Fileオブジェクト生成時にファイルを一覧化する対象のディレクトリを指定します。
Fileクラスの配列を定義して、Fileクラスのオブジェクトdirに対してlistFilesメソッドでファイルの一覧を取得しています。
フィルタを使用する方法
上述したようにlistFilesメソッドを使用すれば、ファイルの一覧を取得することができますが、ファイルの数が膨大な場合、特定のファイルを見つけるのが困難な場合があります。
そのような場合は、指定した条件のファイルのみをフィルタリングするFilenameFilterクラスを使用します。
FilenameFilterクラスを使用するためには「import java.io.FilenameFilter」をインポートします。
また、FilenameFilterクラスはインタフェースとして実装されており、指定されたファイルをリストに含めるか判定するためのacceptメソッドを指定する必要があります。
boolean accept(File dir, String name)
指定文字列でフィルタする
以下にFilenameFilterクラスを使用した、ファイルをフィルタリングする方法を記述します。
public class fileClass{ public fileClass() throws IOException{ //フィルタを作成する FilenameFilter filter = new FilenameFilter() { public boolean accept(File file, String str){ //指定文字列でフィルタする //indexOfは指定した文字列が見つからなかったら-1を返す if (str.indexOf("java") != -1){ return true; }else{ return false; } } }; //“java”が含まれるフィルタを作成する File[] files = new File("/Users/Shared/java").listFiles(filter); //結果を出力する for(int i=0; i<files.length; ++i){ System.out.println(files[i]); } } }
実行結果 /Users/Shared/java/java.csv /Users/Shared/java/java.txt /Users/Shared/java/java1.txt /Users/Shared/java/java2.txt /Users/Shared/java/javaIn.txt /Users/Shared/java/javaOut.txt
サンプルでは、フィルタリングしたファイルを一覧化するためにFileクラスのlistFilesメソッドを使用し、引数にFilenameFilterクラスのオブジェクトを指定しています。
FilenameFilterクラスの処理では、acceptメソッドの処理で指定した文字列が存在した場合はtrueを、存在しなかった場合はfalseを返します。
実行結果のとおり、指定した文字列”java”が含まれているファイル名だけが、リストとして取得されていることがわかります。
また、指定した文字列を検索するには、StringクラスのindexOfメソッドを使用する必要があります。indexOfについては以下の記事で詳しく解説しています。
拡張子でフィルタする
ファイルを指定した拡張子のみリスト化する場合には、acceptメソッドの処理内でStringクラスのendsWithメソッドを使用して、引数に拡張子を指定します。
以下にファイルの拡張子を指定してリスト化する方法を記述します。
public class fileClass{ public fileClass() throws IOException{ //フィルタを作成する FilenameFilter filter = new FilenameFilter() { public boolean accept(File file, String str){ // 拡張子を指定する if (str.endsWith("txt")){ return true; }else{ return false; } } }; //"txt"が含まれるフィルタを作成する File[] files = new File("/Users/Shared/java").listFiles(filter); //結果を出力する for(int i=0; i<files.length; ++i){ System.out.println(files[i]); } } }
実行結果 /Users/Shared/java/java.txt /Users/Shared/java/java1.txt /Users/Shared/java/java2.txt /Users/Shared/java/javaIn.txt /Users/Shared/java/javaOut.txt /Users/Shared/java/php.txt /Users/Shared/java/php2.txt
サンプルでは、endsWithメソッドで拡張子”.txt”を指定し、ファイルが存在したらtrueを返却しています。
なお、ファイルの最初の文字列を指定して検索する場合には、startsWithメソッドを使用します。
Fileクラスについてもっと詳しく知りたい方へ
Fileクラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここでは、指定したディレクトリの中のファイル一覧を取得する方法や、一覧の中から指定した文字列や拡張子でフィルタリングする方法を説明しました。
ファイルの数が膨大な場合は、指定した条件を含むファイルを一覧化するのにFilenameFilterクラスを使用すると便利ですのでぜひ覚えておきましょう。
もしファイルをフィルタする処理を忘れてしまったら、この記事を思い出してくださいね!