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

Java 從完整路徑提取文件名:split 正則處理 Windows/Unix 路徑分隔符最佳實踐

     編輯:Java 相關知識

場景

上傳文件路徑可能來自 Windows (C:\path\file.txt) 或 Linux (/home/user/file.txt),需統一提取文件名。

1. 簡單 split 方案 (僅 Unix 或已知分隔符)

String path = "/home/user/docs/report.pdf";
String fileName = path.substring(path.lastIndexOf('/') + 1); // 推薦:lastIndexOf 最快

// 或 split
String[] parts = path.split("/");
String fileName = parts[parts.length - 1];

2. 跨平台通用方案:統一分隔符後 split

public static String getFileName(String path) {
    if (path == null) return null;
    // 將所有反斜線統一為正斜線
    String normalized = path.replace('\\', '/');
    int idx = normalized.lastIndexOf('/');
    return idx >= 0 ? normalized.substring(idx + 1) : normalized;
}

// 測試
System.out.println(getFileName("C:\\Users\\Tom\\file.txt")); // file.txt
System.out.println(getFileName("/var/log/app.log"));         // app.log
System.out.println(getFileName("relative/path/file"));       // file
System.out.println(getFileName("no_separator"));             // no_separator

3. 使用 Paths API (Java 7+,最規範)

import java.nio.file.*;

public static String getFileNameNio(String path) {
    return Paths.get(path).getFileName().toString();
}

// 注意:Windows 路徑在 Linux JVM 上可能解析異常,建議先 normalize
String safe = Paths.get(path.replace('\\', '/')).getFileName().toString();

4. 正則 split 寫法 (教學用)

// 同時匹配 / 和 \
String[] parts = path.split("[/\\\\]"); // 雙重轉義:字串 "\\" → 正則 "\" → 字面反斜線
String fileName = parts[parts.length - 1];

5. 效能對比 (JMH 參考)

方法耗時 (ns/op)備註
lastIndexOf + substring~15最快,無物件分配
replace + lastIndexOf~30跨平台通用
Paths.get~120物件創建多,功能豐富
split 正則~200正則編譯開銷大

6. 最佳實務建議

  1. 高頻調用 → lastIndexOf('/') 後手動處理反斜線,或預先統一分隔符。
  2. 需解析父目錄、規範化路徑 → Paths.get() / File API。
  3. 避免在循環中重複編譯正則,預編譯 Pattern.compile("[/\\\\]")。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved