[英]How to avoid FileNotFound exception when running Java on Linux because of case sensitiveness?
我的Web應用程序在Windows上運行。 我想在Linux上運行我的應用程序。 我似乎已經克服了大多數問題,比如路徑分隔符等。
真正的問題是,當Java代碼嘗試打開文件時,我得到FileNotFoundException
,當只有abc.txt
存在時,說Abc.txt
。 :(
我不能繼續將所有文件名更改為小寫或大寫,因為我有很多文件。 如果不改變代碼,那么有什么方法可以避免這種情況?
修理它!
從長遠來看,你設計的任何方案都可以避免修復它。
由於java.io.File
API與系統有關,因此無法避免這種情況。 在Linux / Unix上操作文件時必須使用正確的大小寫。 實際上,我的建議/解決方案是在Windows開發過程中遵循嚴格的可移植約定(例如,僅使用小寫文件名,或者更好, 在以編程方式訪問時使用確切的文件名 )。 說實話,我不明白你為什么要在文件名為abc.txt
時加載Abc.txt
。 這是一個壞習慣(通過花太多時間在Windows上講授)而不是Linux / Unix問題。
好吧,首先我認為你應該考慮轉向一致的命名方案,而不是使用一些解決方法。
無論如何,如何閱讀所有文件名並將它們放入包含小寫名稱作為鍵的地圖中? 然后,您可以從地圖中查找正確的文件名 。
這也可以讓你檢測到沖突,例如同一個目錄中有兩個文件“FileA.txt”和“FILEA.TXT”,它們具有相同的小寫表示,在這種情況下你知道你必須解決這個問題。一種完全不同的方式(因為你必須知道你想要打開哪一個,而且它是模棱兩可的,而且這樣的解決方法不會這樣做)。
假設Linux上的文件是混合大小寫,對此沒有簡單的答案。
我能想到的最好的方法是讓您的應用程序列出相關目錄,並創建實際Linux文件名的內存數據結構。 然后,要打開不區分大小寫的文件,將路徑名拆分為組件,使用不區分大小寫的搜索搜索內存中的樹,使真實(區分大小寫)的路徑名生成並使用THAT打開文件。
這個問題是它(實際上你的應用程序)無法應對你在同一個Linux目錄中有(例如)“foo.txt”和“Foo.txt”的情況。
但最好的解決方案是更改您的應用程序,使其適用於區分大小寫的路徑名。
你為什么不能改變很多文件? 如果文件的數量確實是唯一可以阻止你的東西,那么只需編寫一個小腳本,將它們全部重命名為小寫。
從您的問題中不清楚是什么原因導致您的文件更改。 如果你的所有文件在linux中都是小寫的,雖然它們在windows上是混合大小寫,你可以將文件名轉換為小寫,如下所示:
new File(filename.toLowerCase())
有一個解決方案具有可怕的運行時性能,但實現起來非常簡單:
用類似的東西替換new FileReader(name)
openFile(name);
public FileReader openFile(String name) throws FileNotFoundException {
File dir = (new File(name)).getParentFile();
for (File f : dir.listFiles()) {
if (f.getName().equalsIgnoreCase(name)) {
return new FileReader(f);
}
throw new FileNotFoundException("File not found: " + name);
}
我沒有編譯這段代碼,它可能有錯別字和錯誤。 我把它留給你解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.