【问题标题】:Simplify opening the file in the same folder as .jar简化在与 .jar 相同的文件夹中打开文件
【发布时间】:2014-10-28 03:32:33
【问题描述】:

旁边有一个可运行的 jar 文件和data.txt 文件。 data.txt 可能会动态变化。程序需要读取这个文件的内容。我第一次尝试打开文件不起作用:

new InputStreamReader(getClass().getResourceAsStream("/data.txt"), "UTF-8");

我想到了以下解决方案,但它很复杂,有点尴尬:

new InputStreamReader(new FileInputStream(new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getParent() + "/data.txt"), "UTF-8");

很难理解这里发生了什么。

我试了new File("./data.txt"),NPE被抛出了。

如何打开data.txt 与.jar 文件位于同一文件夹中但可读性更强的文件?

【问题讨论】:

  • 我认为解决方案在这里有详细描述-stackoverflow.com/questions/8775303/…
  • 首先,不要写长链聚合物的陈述,尤其是当你不知道自己在做什么的时候。它们无法调试。
  • @HotLicks,其实我知道这个具体的语句是做什么的。但是对于另一个人,甚至是对我来说,一段时间后,它需要时间来理解。这就是为什么我需要更好的解决方案:)
  • 所以,把它分成几个步骤,每个步骤分配给一个临时的。然后您可以轻松调试它。而且,可怕的是,考虑为每一步实际添加 cmets。

标签: java file-io java-8


【解决方案1】:

有两种方法可以定位类文件的基本路径,您可能会发现这两种方法都比必要的复杂。

第一个是您的问题中已有的内容:

URL url = MyClass.class.getProtectionDomain().getCodeSource().getLocation();

第二个是

URL url=MyClass.class.getResource("MyClass.class");
if(url.getProtocol().equals("jar"))
    url=((JarURLConnection)url.openConnection()).getJarFileURL();
else url=MyClass.class.getResource("/");// for file: directories

URL 你可以得到一个UTF-8 Reader

Reader r = Files.newBufferedReader(Paths.get(url.toURI()).resolveSibling("data.txt"));

【讨论】:

    【解决方案2】:

    你有没有set the Class-Path of the Jar file? 如果你包括一个“。”在类路径中,我认为它会按照您最初的设想工作。

    在 Jar 文件的清单中:

    类路径:.

    在代码中:

    InputStream ins = getClass().getResourceAsStream("/data.txt");
    ... // do stuff with stream
    

    我没有测试过这个,但我做过类似的东西,我相信它会起作用。

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 2022-01-20
      • 2014-01-03
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2014-01-28
      • 2014-04-06
      • 2016-06-06
      相关资源
      最近更新 更多