2

我有一个 Swing Java 程序,它读取名为“res”的资源文件夹中的 *.txt 文件,其中包含不同类型 JSON 的子文件夹。当我直接从 Eclipse 运行时,一切都很好。如果我创建一个可执行的 jar 它不起作用。我设法使它与一个可怕的解决方案一起工作,将我所有的文本文件放在它们被调用的包中。

要阅读它们,我使用这行代码:

InputStream is = this.getClass().getResourceAsStream(file + ".txt");

其中文件是一个字符串。我认为这会在 jar 中搜索指定的文件,但显然不是。我试图放置文件的路径 res/subfolder/name_of_file.txt 和 subfolder/name_of_file.txt 但无济于事。这是我的项目的结构

Project
   src
      com.package
   res
      JSON_type1
      JSON_type2
         file.txt

在 com.package 中,我有一个必须从 JSON_type2/file.txt 读取的类。除了将我的文本文件组织在子文件夹中的明显原因之外,我的 GUI 将使用这些子文件夹的内容填充一个下拉列表。

从我从这里的其他问题中收集到的信息来看,如果我想将我的文本文件保存在调用它们的包中,那么 getResourceAsStream() 将是我的解决方案。除此之外,我发现了一些关于子类化ClassLoader和覆盖findResource()的信息。如果可能的话,我想避免这种解决方案,因为我远不熟悉该类及其功能。

如果您需要更多信息,请告诉我。

谢谢

PS:这个问题来自我之前的问题here

4

3 回答 3

4

您可以通过用斜杠分隔包中的文件来寻址,例如对于 file.txt,您应该getResourceAsStream("/res/JSON_type2/file.txt")

斜杠不用于文件夹结构,也不依赖于平台,它们只是类加载器寻址文件的方式。

于 2012-04-23T18:29:11.777 回答
4
// added leading / to indicate search from root of class-path
String file = "/res/JSON_type2/file.txt";
InputStream is = this.getClass().getResourceAsStream(file);
于 2012-04-23T18:29:24.853 回答
1

通过这样做,我基本上能够获得您在 Eclipse 中寻找的功能:

src (folder)
   main (package)
      ...Classes...
other (folder)
   res  (package)
      ...txt files...

Eclipse 似乎完全忽略了文件夹,只关心包。只要我将文本文件放在一个包中,我就可以使用 getResourceAsStream("/res/somefile.txt") 获取 InputStream。

于 2012-06-12T09:03:37.203 回答