[Java]File#listFilesのFilenameFilterで結果が取れてこなかった話

システム開発Tips

Tipsでもなんでもない話ですけどね。

ここ最近Javaでファイルを扱うことがあったので、FileクラスのlistFilesについてのメモ書き。

結論から言うとただの勘違いの話なのですが。


あるディレクトリの配下のファイル一覧が欲しくて最初はフィルターを使わずに以下のようにlistFilesの戻り値をforeachで回して判定処理を行っていました。

for (File f : new File("ディレクトリ").listFiles()) {
    if (!f.isFile() || !f.getName().endsWith(".txt")) {
        continue;
    }

    // なんかの処理
}

よくよく調べ得てみるとlistFilesの引数にfilterを指定できて、

filter使えば必要なものだけをlistFilesの結果として返せるなと思い

filterを使うように変えてみました。。

// こんな感じでフィルターを使おうかな
FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File file, String fileName){
        if (!file.isFile() || !fileName.endsWith(".log")) {
            return false;
        }
        return true;
    }
};

for (File file : new File("ディレクトリ").listFiles(filter)) {
    // なんかの処理
}

とまぁやったのはいいけど、なんだ全然結果に帰ってこない!

とちょっと焦ったのですが、

参考にしたサイトのacceptの第一引数が、File fileになってたのでfile.isFile()を一生懸命してせいでした。

acceptの第一引数ってファイルが見つかったディレクトリを返すのですね。
公式ではFile dirになってる

そもそもFilenameFilterに入ってくる時点でファイルじゃん。と気づいた2020年でした。


結局こんな感じになった。

FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File dir, String fileName){
        return !fileName.endsWith(".log");
    }
};

for (File file : new File("ディレクトリ").listFiles(filter)) {
    // なんかの処理
}

フォローお願いします!

コメント

タイトルとURLをコピーしました