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)) {
// なんかの処理
}
コメント