FileFilter(JDK 1.2+)比 FilenameFilter 更強大:它接收 File 對象,可直接判斷是文件還是目錄,避免「無法區分文件夾與同名文件」的尷尬。本文給出按擴展名過濾的完整實現與調用示例。
// FileFilter
boolean accept(File file);
// FilenameFilter
boolean accept(File directory, String name);
package com.generationjava.io.find;
import java.io.File;
import java.io.FileFilter;
public class ExtensionFileFilter implements FileFilter {
private String extension;
public ExtensionFileFilter(String extension) {
this.extension = extension;
}
public boolean accept(File file) {
if (file.isDirectory()) return false; // 僅文件
String name = file.getName();
int idx = name.lastIndexOf('.');
if (idx == -1) return false; // 無擴展名
if (idx == name.length() - 1) return false; // 以點結尾
return this.extension.equals(name.substring(idx + 1));
}
}
String dir = "C:/config";
File file = new File(dir);
File[] files = file.listFiles(new ExtensionFileFilter("cfg"));
// files 即為 C:/config 下所有 .cfg 文件
FileFilter 源自 javax.swing.filechooser.FileFilter(抽象類),Swing 的 JFileChooser 同樣使用該機制。Files.newDirectoryStream(Path, Glob) 或 Files.walkFileTree 獲得更豐富的遍歷控制。