FileNotFoundException 路徑含隱形字元排查實戰java.io.FileNotFoundException: D:\1.txt (文件名、目錄名或卷標語法不正確)
乍看路徑 D:\1.txt 沒問題,但異常訊息前的 (Unicode **U+202A LEFT-TO-RIGHT EMBEDDING**,一個不可见的雙向文字控制字元)暴露真相:**原始碼字串字面量混入了隱形字元**。
U+202A、U+202B、U+202C、U+200E、U+200F 等雙向標記或零寬空格(U+200B)。new File("D:\\1.txt") 實際路徑以隱形字元開頭,Windows 檔案系統不認得,拋出「語法不正確」。View → Active Editor → Show Whitespaces),隱形字元會顯示為紅點或特殊符號。Ctrl+Shift+A 輸入 Show Hex,或用線上工具(如 https://www.onlinehextools.com/convert-string-to-hex)貼上字串檢查是否含 202A、200B 等。String path = "D:\\1.txt"; // 你的字串
for (int i = 0; i < path.length(); i++) {
char c = path.charAt(i);
if (c < 32 || c == 0x200B || c == 0x202A || c == 0x202B || c == 0x202C) {
System.out.printf("Hidden char at %d: U+%04X%n", i, (int)c);
}
}
"D:\\1.txt"(雙反斜桿轉義)或 "D:/1.txt"(Java 支援正斜桿跨平台)。Path / Paths.get (NIO.2):
Path path = Paths.get("D:", "1.txt"); // 自動處理分隔符,避免字串拼接錯誤
File file = path.toFile();
.java 檔,移除 [\u2000-\u206F\uFEFF\uFFF0-\uFFFF] 範圍內的控制字元(保留 \t\n\r)。Editor → Inspections → General → Non-ASCII characters)。Paths.get 或 FileSystems.getDefault().getPath(),避免手工拼接分隔符。Windows 路徑**不分大小寫**,D:\ 與 d:\ 等價。真正修好的原因是重新輸入時去除了隱形字元,而非大小寫變化。
總結: FileNotFoundException 伴隨「語法不正確」且路徑看似正確時,**優先懷疑字串含隱形 Unicode 控制字元**。用十六進位檢視、IDE 顯示空白字元、手動重打路徑三步驟可快速定位解決。