簡體   English   中英

由於區分大小寫,如何在Linux上運行Java時避免FileNotFound異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM