获取文件在资源文件夹中的位置作为字符串

Getting location of file as string in resource folder

我已经在 eclipse 中完成了一个程序,现在我想将它导出为一个可运行的 jar 文件。该程序包含一个资源文件夹,其中包含图像和文本文件。它位于源文件夹下。

res 文件没有添加到构建路径中,但是当我在 Eclipse 中运行该程序时它仍然有效。 令我困惑的是,当我导出 res 文件时,它被保存到可运行的 jar 文件中,因为我可以用 WinRar 打开 Jar 文件,我看到文件夹里有所有的对象。但是当我运行问题时,它会在引用资源文件夹时停止。当我手动复制 res 文件夹并将其粘贴到保存可运行 jar 文件的位置旁边并运行该程序时,我感到更加困惑,它完全按照应有的方式工作。

现在我知道这与我在代码中引用文件的方式有关。目前我是这样的

reader = new LineNumberReader(new FileReader("res/usernames.txt"));

这完全符合我的要求,并且毫无例外地访问 res 文件夹 - 在 Eclipse 中以及当我将资源文件夹移动到 Jar 文件旁边时。

我希望它能正常工作,但在 Jar 文件之外没有文件夹,我希望它全部封装在一个 Jar 文件中。

我做了很多研究,似乎是一个常见的修复 - 我可以补充一下,我真的不知道它是如何工作的,但似乎每个人都提到它 - 在某个地方使用:

myClass().getResource()

当我创建一个新的 FileReader 时,它需要一个字符串输入,但是当我使用 myClass().getResource() 时,它 returns 是一个资源而不是一个字符串。我也不知道引用资源文件夹的含义。我应该将资源文件夹移动到源文件夹吗?

有谁知道如何从可运行的 jar 文件中引用资源文件夹?

抱歉这个漫无边际的问题,我知道我想要的最终产品是什么,但我对构建路径和类内引用感到困惑,我在网上搜索了很长时间试图弄清楚。

部署软件时,资源不会作为文件夹中的文件进行部署。它们被打包为应用程序 jar 的一部分。您可以通过从罐子内部检索它们来访问它们。 class 加载程序知道如何从 jar 中检索内容,因此您可以使用 class 的 class 加载程序来获取信息。

这意味着您不能对它们使用 FileReader 之类的东西,或任何其他需要文件的东西。资源不再是文件。它们是位于 jar 中的字节束,只有 class 加载程序知道如何检索。

如果资源是图片等,可以被知道如何访问资源 URL 的 java classes 使用(即获取数据当它们在 jar 中被指定位置时从 jar 中获取),您可以使用 ClassLoader.getResource(String) 方法获取 URL 并将其传递给处理它们的 class。

如果您想直接对资源中的数据执行任何操作(通常是通过从文件中读取数据来执行),则可以改用 ClassLoader.getResourceAsStream(String).

方法

此方法 returns 一个 InputStream,您可以像使用任何其他方法一样使用它 InputStream - 对其应用 Reader 或类似的方法。

因此您可以将代码更改为:

InputStream is = myClass().getResourceAsStream("res/usernames.txt");
reader = new LineNumberReader( new InputStreamReader(is) );

请注意,我使用了 Class 中的 getResourceAsStream() 方法,而不是 ClassLoader。这两个版本在 jar 中查找资源的方式略有不同。请阅读 Class and ClassLoader.

的相关文档