通過觀察路徑特徵制定判斷規則:
/ 開頭 (Linux/macOS) 或包含 : (Windows 盤符如 C:\)bin、data/config、..\parentpublic class PathUtils {
/**
* 判斷是否為絕對路徑
* @param path 輸入路徑
* @return true=絕對路徑, false=相對路徑
*/
public static boolean isAbsolutePath(String path) {
if (path == null || path.isEmpty()) return false;
// Linux/macOS: 以 / 開頭
// Windows: 包含冒號 (如 C:、D:)
return path.startsWith("/") || path.indexOf(':') > 0;
}
/**
* 判斷是否為相對路徑
*/
public static boolean isRelativePath(String path) {
return !isAbsolutePath(path);
}
}
public static void main(String[] args) {
String[] paths = {
"/opt/tomcat/bin", // Linux 絕對
"C:\\develop\\tomcat", // Windows 絕對
"bin", // 相對
"conf/server.xml", // 相對
"../logs", // 相對
"./temp", // 相對
"D:data", // Windows 相對 (無反斜線)
};
for (String p : paths) {
System.out.printf("%-25s -> 絕對路徑: %b%n", p, isAbsolutePath(p));
}
}
/opt/tomcat/bin -> 絕對路徑: true
C:\develop\tomcat -> 絕對路徑: true
bin -> 絕對路徑: false
conf/server.xml -> 絕對路徑: false
../logs -> 絕對路徑: false
./temp -> 絕對路徑: false
D:data -> 絕對路徑: true (技術上是相對當前盤符目錄,但符合冒號特徵)
import java.nio.file.Path;
import java.nio.file.Paths;
public static boolean isAbsolutePathNIO(String path) {
return Paths.get(path).isAbsolute();
}
優勢:跨平台自動處理分隔符、規範化、解析 . ..;缺點:較字串檢查稍慢。
startsWith("/") || contains(":")Path/Paths APIResourceUtils 或 FileSystemResource 統一處理/ 開頭) 與「文件系統路徑」路徑判斷看似簡單,跨平台部署時卻是常見 Bug 來源,建議統一封裝工具類並編寫完整單元測試。