由于区分大小写,在Linux上运行Java时如何避免FileNotFound异常?

由于区分大小写,在Linux上运行Java时如何避免FileNotFound异常?,java,linux,case-sensitive,filenotfoundexception,Java,Linux,Case Sensitive,Filenotfoundexception,我的web应用程序在Windows上运行。我也想在Linux上运行我的应用程序。我似乎已经克服了大多数问题,如路径分隔符等 现在真正的问题是,当Java代码试图打开一个文件时,我得到了FileNotFoundException,比如说Abc.txt,而只有Abc.txt存在( 我无法继续将所有文件名更改为小写或大写,因为我有很多文件。如果不更改代码,这有什么办法可以避免这种情况?您的问题不清楚是什么导致了文件的大小写更改。如果linux中的所有文件都是小写的,而windows中的文件大小写混合,

我的web应用程序在Windows上运行。我也想在Linux上运行我的应用程序。我似乎已经克服了大多数问题,如路径分隔符等

现在真正的问题是,当Java代码试图打开一个文件时,我得到了
FileNotFoundException
,比如说
Abc.txt
,而只有
Abc.txt
存在(


我无法继续将所有文件名更改为小写或大写,因为我有很多文件。如果不更改代码,这有什么办法可以避免这种情况?

您的问题不清楚是什么导致了文件的大小写更改。如果linux中的所有文件都是小写的,而windows中的文件大小写混合,那么您可以t将文件名转换为小写,如下所示:

new File(filename.toLowerCase())

嗯,首先我认为你应该考虑使用一个一致的命名方案,而不是使用一些解决方案。

无论如何,读入所有文件名并将它们放入一个包含小写名称作为键的映射怎么样?然后,您可以从映射中查找正确的文件名


这还允许您检测冲突,例如,同一目录中的两个文件“FileA.txt”和“FileA.txt”具有相同的小写表示形式,在这种情况下,您知道必须以完全不同的方式解决问题(因为你必须知道你想打开哪一个,而且它是不明确的,这样的解决办法在那时是不行的).

由于
java.io.File
API依赖于系统,因此无法避免这种情况。在Linux/Unix上操作文件时,必须使用正确的大小写。实际上,我的建议/解决方案是在Windows上开发时遵循严格的可移植约定(例如,仅使用小写文件名,或者更好的做法是,在以编程方式访问它时使用确切的文件名。)。老实说,我不明白当文件名为
Abc.txt
时,为什么要尝试加载
Abc.txt
。这是一个坏习惯(在Windows上花费太多时间)而不是Linux/Unix问题。

假设文件在Linux上是混合情况,没有简单的答案

我能想到的最好方法是让应用程序列出相关目录,并创建实际Linux文件名的内存中数据结构。然后要打开不区分大小写的文件,请将路径名拆分为组件,使用不区分大小写的搜索来搜索内存中的树,并创建真实的(区分大小写)路径名并使用它打开文件

问题是,它(以及你的应用程序)无法处理(比如)“foo.txt”和“foo.txt”在同一个Linux目录中的情况


但最好的解决方案是更改应用程序,使其与区分大小写的路径名一起工作。

有一种解决方案运行时性能很差,但实现起来非常简单:

新文件读取器(名称)
替换为以下内容

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);
}
我还没有编译这段代码,它可能有打字错误和bug。我把它们留给你去修复。

修复它


从长远来看,你设计的任何绕过修复的方案都会更糟糕。

为什么你不能更改很多文件?如果文件的数量确实是唯一阻碍你的因素,那么只需编写一个小脚本,将它们全部重命名为小写。

请注意,不区分大小写的操作系统是例外,而不是规则。Windows几乎是剩下的唯一一个以不区分大小写的方式处理文件的主要操作系统。在我看来,Windows上的一个好策略是保留大小写,即使不区分大小写。不要让您的代码以多个大写字母引用文件,也不要排列给定路径的大小写。让我们说这不是我的代码,但我负责能够使应用程序在linux上运行。在所有目标平台上安装构建和测试服务器将在过程中更早地发现其中许多问题。尝试这样做。:P但不建议这样做,对吗?将遵循最佳编程实践。:)我们所说的打开文件的开销大约为100毫秒。如果不经常发生这种情况,此解决方案就可以了。如果性能有问题,但目录不经常更改,则可以缓存目录列表。但最好从根本上解决问题。您知道“重命名”吗Linux上的工具?只有当文件名本身拼写错误时,这才有效,而不是在任何父目录中出现问题时。这一点很好!当然,我的乱七八糟可以扩展到对目录名做同样的事情。