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

Java 文件搜尋實戰:按前綴、後綴、關鍵字精準過濾文件

     編輯:Java 綜合教學

Java 文件搜尋實戰:按前綴、後綴、關鍵字精準過濾文件

在 Java 中遍歷目錄並按名稱規則過濾文件是常見需求。本文通過一個完整示例,講解 File.list()、startsWith()、endsWith()、contains() 組合實現多條件文件搜尋,並重點剖析路徑拼接陷阱。

一、核心代碼實現

import java.io.File;
import java.io.FileNotFoundException;

public class SearchFile {
    public static void main(String[] args) throws FileNotFoundException {
        // 1. 指定搜尋根目錄 (此處為 F 盤根目錄)
        File dir = new File("F:/");

        // 2. 獲取目錄下所有文件/子目錄名稱字符串數組
        String[] names = dir.list();
        if (names == null) {
            System.out.println("目錄不存在或無讀取權限");
            return;
        }

        // 3. 遍歷過濾
        for (String name : names) {
            // 條件 1:文件名以 "ja" 開頭 (前綴匹配)
            boolean isPrefixMatch = name.startsWith("ja");

            // 條件 2:必須是文件而非目錄 (關鍵:需用絕對路徑構建 File 對象)
            File file = new File(dir.getAbsolutePath() + File.separator + name);
            boolean isFile = file.isFile();

            // 條件 3:文件名包含 "va" (關鍵字匹配)
            boolean containsKeyword = name.contains("va");

            // 組合條件:根據業務靈活調整
            if (isPrefixMatch && isFile && containsKeyword) {
                System.out.println("匹配文件:" + name);
            }
        }
    }
}

二、關鍵技術點深度解析

2.1 File.list() vs File.listFiles()

  • list():返回 String[],僅文件名,**不含路徑**,輕量但後續需自行拼接路徑判斷類型。
  • listFiles():返回 File[],直接拿到文件對象,可直接調用 isFile()、isDirectory(),**推薦實戰使用**。

2.2 路徑拼接的「必殺技」:File.separator 與 getAbsolutePath()

原代碼第 11 行:

boolean b = (new File(files.getAbsolutePath() + s)).isFile();

錯誤寫法: new File(s).isFile()

原因: new File("相對路徑") 會相對於**當前工作目錄**(通常是專案根目錄)解析,而非目標目錄 F:\。若專案目錄無同名文件,永遠返回 false。

正確姿勢:

File target = new File(dir.getAbsolutePath() + File.separator + name);
// 或 Java 7+ 推薦
Path target = Paths.get(dir.toURI()).resolve(name);
boolean isFile = target.toFile().isFile();
  • getAbsolutePath() 確保基準路徑絕對化。
  • File.separator 自動適配 Windows (\) 與 Linux (/) 分隔符,跨平台無憂。

2.3 字符串匹配方法選擇指南

忽略大小寫技巧: 先 name.toLowerCase() 再匹配,或用 Pattern.compile(regex, Pattern.CASE_INSENSITIVE)。

三、進階版:遞歸搜尋子目錄 (Java 7+ NIO.2)

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class RecursiveSearch {
    public static void main(String[] args) throws IOException {
        Path root = Paths.get("F:/");
        String keyword = "ja";

        Files.walkFileTree(root, new SimpleFileVisitor() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                String name = file.getFileName().toString();
                if (name.toLowerCase().startsWith(keyword)) {
                    System.out.println("命中:" + file.toAbsolutePath());
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) {
                System.err.println("無法訪問:" + file + " 原因:" + exc.getMessage());
                return FileVisitResult.CONTINUE;
            }
        });
    }
}

優勢: 自動遞歸、異常處理、流式處理大目錄不佔記憶體、支援並行流 Files.walk(...).parallel() 加速。

四、總結

  1. 文件搜尋核心三步:**指定目錄 → 獲取列表 → 條件過濾**。
  2. 路徑拼接必須絕對化,切勿直接用相對文件名構建 File 判斷類型。
  3. 優先使用 File.listFiles() 或 NIO.2 Files.walkFileTree,代碼更健壯簡潔。
  4. 匹配條件靈活組合:前綴/後綴/包含/正則,按業務場景選擇。

掌握這些細節,無論是日誌清理、配置文件掃描、還是批量文件處理,都能游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法用途示例大小寫敏感
startsWith(prefix)前綴匹配"java.txt".startsWith("ja") // true是
endsWith(suffix)後綴匹配 (如副檔名)"data.csv".endsWith(".csv") // true是
contains(substr)包含關鍵字"report.pdf".contains("port") // true是
matches(regex)正則表達式"img001.jpg".matches("img\\d+\\.jpg") // true是