首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 檔案副檔名過濾器實作(FileNameFilter)

     編輯:Java 相關知識

前言

依副檔名過濾檔案是常見需求。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());
            }
        }
    }
}

關鍵點解析

1. FilenameFilter 介面

@FunctionalInterface
public interface FilenameFilter {
    boolean accept(File dir, String name);
}
  • dir:被檢查的目錄
  • name:檔案名稱(不含路徑)
  • 返回 true 表示符合條件

2. Lambda 表達式簡化

// Java 8+ Lambda 寫法
(dir1, name) -> name.toLowerCase().endsWith("." + extension.toLowerCase())

優點:大小寫不敏感、程式碼簡潔。

3. 傳統匿名類別寫法 (Java 7 相容)

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);
        }
    }
}

使用 NIO.2 現代寫法 (Java 7+)

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 返回 null:目錄不存在、非目錄、權限不足、IO 錯誤
  • 大小寫敏感:Windows 不敏感,Linux 敏感,建議統一轉小寫比較
  • 隱藏檔案:listFiles 包含隱藏檔,如需排除可加 !name.startsWith(".")

總結

Java 檔案過濾核心在於 FilenameFilter 介面。現代專案建議使用 Lambda 表達式或 NIO.2 Files.walk 配合 Stream API,程式碼更簡潔、功能更強大(支援遞歸、平行處理)。本文提供的範例可直接用於專案或學習參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved