代码之家  ›  专栏  ›  技术社区  ›  Senthil Kumar

在Linux上运行Java时,如何避免文件敏感异常?

  •  4
  • Senthil Kumar  · 技术社区  · 14 年前

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

    现在真正的问题是我 FileNotFoundException 当Java代码试图打开文件时 Abc.txt 只有时 abc.txt 存在。:(

    我不能继续把所有文件名都改成小写或大写,因为我有很多文件。在不改变太多代码的情况下,有没有可能避免这种情况?

    7 回复  |  直到 14 年前
        1
  •  3
  •   Pascal Thivent    14 年前

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

        2
  •  4
  •   Thorbjørn Ravn Andersen    14 年前

    把它修好!

    从长远来看,你设计的任何规避解决方案都会更糟。

        3
  •  2
  •   Roland Ewald    14 年前

    好吧,首先我想你 应该 考虑移动到一致的命名方案,而不是使用一些变通方法。

    不管怎样,怎么样 读取所有文件名并将其放入地图中 是否将小写名称作为键?那么你就可以 从地图中查找正确的文件名 .

    这也将允许您检测到冲突,例如,同一目录中具有相同小写表示形式的两个文件“filea.txt”和“filea.txt”,在这种情况下,您知道必须以完全不同的方式解决问题(因为您必须知道要打开哪个文件,它是不明确的,并且这样的解决方法我不会那么做的。

        4
  •  1
  •   Stephen C    14 年前

    假设这些文件在Linux上是混合的,没有简单的答案。

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

    问题在于,它(实际上是你的应用)无法处理你在同一个Linux目录中(比如说)“foo.txt”和“foo.txt”的情况。

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

        5
  •  1
  •   Joachim Sauer    14 年前

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

        6
  •  0
  •   Alexander Torstling    14 年前

    从你的问题中还不清楚是什么导致了你的文件的案例变更。如果在Linux中所有文件都是小写的,而在Windows中它们是混合大小写的,则可以将文件名转换为小写,如下所示:

    new File(filename.toLowerCase())
    
        7
  •  0
  •   Carl Smotricz    14 年前

    有一种解决方案具有糟糕的运行时性能,但实现起来非常简单:

    更换 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);
    }
    

    我没有编译这段代码,它可能有打字错误。我把它们留给你去修理。