大家常說「Java 跨平台」,但真正能不能跨平台,關鍵還得看開發者怎麼寫代碼。今天分享一個在 JDBMonitor 專案中遇到的經典案例,關於配置文件路徑在 Windows 與 Linux 下的判斷邏輯差異。
早期版本為了同時支援「類路徑」與「物理路徑」兩種指定配置文件的方式,採用了簡單粗暴的判斷邏輯:若路徑以字母開頭且緊接著 :/(如 c:/config.xml),則視為物理路徑;否則視為類路徑。這在 Windows 下運作良好,但一到 Linux,絕對路徑長這樣 /root/cfg/config.xml,直接被誤判為類路徑,導致讀取失敗拋錯。
既然無法靠前綴完美區分,不如換個思路:優先嘗試按類路徑讀取,若失敗(返回 null),再嘗試按物理路徑讀取。雖然這會帶來一個極端情況——若類路徑下剛好存在同名資源,會優先讀取到它——但在實際業務場景中,這種衝突概率極低,且行為可預期,屬於可接受的權衡。
InputStream is = null;
is = this.getClass().getResourceAsStream(configFile);
if (is == null) {
try {
is = new FileInputStream(configFile);
} catch (FileNotFoundException e) {
is = null;
}
}
這個小插曲提醒我們:跨平台不只是口號,細節處見真章。Tomcat 等成熟容器是如何處理這類問題的?值得有空深入研究。若你有更優雅的方案,歡迎交流指教。