その時よく使われるのは、FileクラスのlistFilesだ。
listFilesには引数無しメソッドに加えて、オーバーロードが2つあって、
それぞれFileFilterとFilenameFilterを引数にとる。
もう既に様々なサイトで使用方法は示されているけれど、
敢えて全パターンを書いてみて、一番”格好良い”のはどれか見てみた。
条件としては以下だ。
・そのディレクトリには、ディレクトリとファイルが存在しているが、必要なのはファイルのみ。
・ファイルといってもjarファイルのみが欲しい。(拡張子が.jarで判断)
・メソッドの戻りはList
そして、こんな感じのソースを書いた。(全力で)
public class ForTest {
private static final String PATH = "U:\\test";
private static final String TARGET_EXTENTION = "jar";
public static void main(String args[]){
for (int i =0 ; i<1000; i++){
filterPatternA();
filterPatternB();
filterPatternC();
}
}
private static void filterPatternA(){
File[] farr = new File(PATH).listFiles();
Listflist = new ArrayList (farr.length);
for (File file : farr){
if (file.isFile() && file.getName().endsWith(TARGET_EXTENTION)){
flist.add(file);
}
}
}
private static void filterPatternB(){
File[] farr = new File(PATH).listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
return f.isFile() && f.getName().endsWith(TARGET_EXTENTION);
}
});
Listflist = Arrays.asList(farr);
}
private static void filterPatternC(){
File[] farr = new File(PATH).listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if (!new File(dir.getAbsolutePath() + "\\" + name).isFile()) return false;
return name.endsWith(TARGET_EXTENTION);
}
});
Listflist = Arrays.asList(farr);
}
}
そして、約3400ファイルあるディレクトリ(U:\test)で実行。
ついでに実行時間も計測(まぁいろんなサイトで速度は変わらん!と言っているが)。
1000回ループさせた。
平均値をとると、A:115.29ミリ秒、B:117.168ミリ秒、C:120.384ミリ秒。
誤差もいいとこ。
やるだけ無駄。速度に優劣無しと判断する。
ところで、本題はどれが一番格好良いか。
Cはあまり好きじゃないなぁ。
FilenameFilterでファイルかどうかを判断するのはスマートじゃないね、きっと。
AかBか、ぱっと見で分かりやすいのはAではないだろうか。
一覧とって判断してるのね、と直感的に分かる。
だけど、やっぱり格好良いのは、Bに決定する(謎
If文無いし。(厳密には書き方なだけだが。。。)
いやいや、AのIf文のところをリファクタリングして、
分かりやすいメソッド名を付けるのが一番格好良いでしょ!という意見もありそう。。。
そういや、該当ファイル無しのときにnullで落ちるのは愛嬌で。。。
勢いで、null判断を入れるの忘れた。
そんじゃ、甲乙つけがたしで(笑
ラベル:java