2012年12月19日

FileのlistFilesを敢えて試した結果

Javaで、あるディレクトリ直下にあるディレクトリ・ファイルの一覧を取得したい。

その時よく使われるのは、FileクラスのlistFilesだ。

listFilesには引数無しメソッドに加えて、オーバーロードが2つあって、
それぞれFileFilterとFilenameFilterを引数にとる。

もう既に様々なサイトで使用方法は示されているけれど、
敢えて全パターンを書いてみて、一番”格好良い”のはどれか見てみた。

条件としては以下だ。
・そのディレクトリには、ディレクトリとファイルが存在しているが、必要なのはファイルのみ。
・ファイルといってもjarファイルのみが欲しい。(拡張子が.jarで判断)
・メソッドの戻りはListで欲しい。nullになっちゃう配列は嫌!

そして、こんな感じのソースを書いた。(全力で)

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();
List flist = 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);
}
});
List flist = 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);
}

});
List flist = 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
posted by Thoughter at 22:37| Comment(0) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。