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

标签 java resources getresource

我已经在 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() 时,它返回一个资源而不是字符串。我也不知道它是如何引用资源文件夹的。我应该将资源文件夹移动到源文件夹中吗?

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

很抱歉问了漫无目的的问题,我知道我想要的最终产品是什么,但我对构建路径和类内的引用感到困惑,并且我在网上搜索了很长时间试图找出答案。

最佳答案

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

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

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

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

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

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

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

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

关于java - 获取资源文件夹中文件的位置作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27788106/

相关文章:

javascript - 如何防止加载外部资源,同时防止出现 “Failed to execute ' write' on 'Document' ”错误?

java - 无法运行用户服务。异常 : Failed to start Java, ServiceStart 返回 4

java/jersey/jackson - 验证输入 JSON

java - 异常 : Already Connected, HttpsUrlConnection

java - Java 中具有原始类型 tryParse 方法的实用程序库?

java - 添加 .txt 文件作为资源 Java

memory - Snakemake 内存限制

javascript - 参数中带有 getter 的 AngularJS 资源

java - Junit + getResourceAsStream 返回 Null

java - 从 jar 访问 jar 外部的资源