こんにちは。「Javaを復習する初心者」です。
今回はディレクトリ内のファイルをファイル名の部分一致検索をするということをやりました。
以下の機能をもつメソッドを作りました。
- 引数:ディレクトリと検索語句。
- リターン:検索語句を含むファイル名のファイル一覧。
上記でリターンの型は配列です。
実装
ソースは以下です。
ソース
public static String[] getFileNames(String path, String word) {
File[] files = new File(path)
.listFiles(pathName -> pathName.isFile() && pathName.getName().contains(word));
String[] names = new String[files.length];
for (int i = 0; i < names.length; i++) {
names[i] = files[i].getName();
}
return names;
}
「new File(path)」でFileクラスのインスタンスを生成しています。引数はパス名文字列です。インスタンスに対して、listFiles()メソッドを呼び出しています。引数がFileFilter filterのメソッドを呼び出しています。FileFilterインターフェースの実装クラスを引数に指定します。ただし、このインターフェースは関数型インタフェースです。そのため、ラムダ式が使えます。引数はFileクラスのインスタンスで、リストに含ませるかを返却します。今回は「ファイルである」かつ「ファイル名に変数wordを含む」という条件の結果を返却しています。これで検索語句を含むファイル名のファイル一覧を取得できます。ただし、File配列です。
File配列を取得した後はString配列に格納し、返却するだけです。for文を使ってString配列にファイル名を格納しています。
ファイル名の一覧を取得
以下のプログラムではローカルの「C:\\temp」フォルダからファイル名の一覧を取得しています。
ソース
String path = "C:\\temp";
System.out.println("一覧");
File[] files = new File(path).listFiles();
for (File file : files) {
System.out.printf("%s-%s", file.isFile() ? "F": "D", file.toString());
System.out.println();
}
System.out.println("検索");
System.out.println(Arrays.toString(getFileNames(path, "es")));
結果
一覧
F-C:\temp\new.txt
D-C:\temp\old
F-C:\temp\test1.txt
F-C:\temp\test2.txt
検索
[test1.txt, test2.txt]
前半はフォルダに含まれるフォルダとファイルを一覧表示しています。ディレクトリが一つだけ含まれていることが分かります。後半は自作メソッドgetFileNamesを使って「es」をファイル名に含むファイルのみの一覧を取得しています。メソッドの結果が配列なのでArrays#toStringメソッドを使って、結果を出力しています。結果ではファイル名のみが出力されています。どのファイル名も「es」を含んでいます。