依副檔名過濾檔案是常見需求。Java 提供 FilenameFilter 介面,配合 File.listFiles(FilenameFilter) 可輕鬆實現。本文提供完整可執行範例,支援互動式輸入目錄與副檔名。
import java.io.*;
import java.util.Scanner;
public class FileNameFilterDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("輸入檔案目錄: ");
String dirPath = scanner.nextLine();
System.out.print("輸入過濾副檔名 (如 txt): ");
String extension = scanner.nextLine();
File dir = new File(dirPath);
if (!dir.exists() || !dir.isDirectory()) {
System.out.println("目錄不存在或非目錄: " + dirPath);
return;
}
// 使用匿名類別實作 FilenameFilter
File[] files = dir.listFiles((dir1, name) -> name.endsWith("." + extension));
if (files == null || files.length == 0) {
System.out.println("未找到符合條件的檔案");
} else {
System.out.println("符合條件的檔案:");
for (File f : files) {
System.out.println(f.getName());
}
}
}
}
@FunctionalInterface
public interface FilenameFilter {
boolean accept(File dir, String name);
}
dir:被檢查的目錄name:檔案名稱(不含路徑)true 表示符合條件// Java 8+ Lambda 寫法
(dir1, name) -> name.toLowerCase().endsWith("." + extension.toLowerCase())
優點:大小寫不敏感、程式碼簡潔。
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith("." + extension);
}
});
String[] extensions = {"jpg", "png", "gif"};
File[] images = dir.listFiles((d, name) -> {
String lower = name.toLowerCase();
for (String ext : extensions) {
if (lower.endsWith("." + ext)) return true;
}
return false;
});
public static void findFiles(File dir, String extension, List<File> result) {
File[] files = dir.listFiles();
if (files == null) return;
for (File f : files) {
if (f.isDirectory()) {
findFiles(f, extension, result);
} else if (f.getName().toLowerCase().endsWith("." + extension.toLowerCase())) {
result.add(f);
}
}
}
import java.nio.file.*;
import java.util.stream.*;
try (Stream<Path> stream = Files.walk(Paths.get(dirPath))) {
stream.filter(Files::isRegularFile)
.filter(p -> p.toString().toLowerCase().endsWith("." + extension.toLowerCase()))
.forEach(System.out::println);
}
import java.io.File;
import java.util.Scanner;
public class FileNameFilter {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
System.out.print("輸入檔案目錄: ");
String str1 = kb.nextLine();
System.out.print("輸入過濾副檔名: ");
String str2 = kb.nextLine();
File f = new File(str1);
if (f.isDirectory()) {
File[] fList = f.listFiles((dir, name) -> name.endsWith("." + str2));
if (fList != null && fList.length > 0) {
for (File file : fList) {
System.out.println(file.getName());
}
} else {
System.out.println("無符合檔案");
}
} else {
System.out.println("非有效目錄");
}
}
}
listFiles 包含隱藏檔,如需排除可加 !name.startsWith(".")Java 檔案過濾核心在於 FilenameFilter 介面。現代專案建議使用 Lambda 表達式或 NIO.2 Files.walk 配合 Stream API,程式碼更簡潔、功能更強大(支援遞歸、平行處理)。本文提供的範例可直接用於專案或學習參考。