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

Java 获取资源文件夹中作为字符串的文件位置,java,resources,getresource,Java,Resources,Getresource,我已经在eclipse中完成了一个程序,现在我想将它导出为一个可运行的jar文件。该程序包含一个资源文件夹,其中包含图像和文本文件。它位于源文件夹下 res文件没有添加到构建路径,但是当我在Eclipse中运行程序时,它仍然可以工作。 让我困惑的是,当我导出res文件时,它被保存到可运行的jar文件中,因为我可以用WinRar打开jar文件,我看到文件夹中有所有的对象。但当我运行这个问题时,它会在引用资源文件夹时停止。当我手动复制并粘贴res文件夹到保存runnable jar文件的地方,并运行

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

res文件没有添加到构建路径,但是当我在Eclipse中运行程序时,它仍然可以工作。 让我困惑的是,当我导出res文件时,它被保存到可运行的jar文件中,因为我可以用WinRar打开jar文件,我看到文件夹中有所有的对象。但当我运行这个问题时,它会在引用资源文件夹时停止。当我手动复制并粘贴res文件夹到保存runnable jar文件的地方,并运行程序时,会更加困惑,因为它的工作方式与它应该做的完全一样

现在我知道这与我如何引用代码中的文件有关。现在我有这样的

reader = new LineNumberReader(new FileReader("res/usernames.txt"));
这正是我想要的工作方式,并在没有任何异常的情况下访问res文件夹——在Eclipse中,以及当我将资源文件夹移到Jar文件旁边时

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

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

myClass().getResource()
当我创建一个新的FileReader时,它需要一个字符串输入,但是当我使用myClass().getResource()时,它返回一个资源而不是字符串。我也不知道引用资源文件夹意味着什么。我应该将资源文件夹移动到源文件夹中吗

有人知道如何从runnable jar文件中引用资源文件夹吗


很抱歉,我想问一个漫无边际的问题,我知道我想要的最终产品是什么,但我被类内的构建路径和引用弄糊涂了,我在网上搜索了很长时间,试图找出答案。

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

这意味着您不能在它们上使用
FileReader
之类的东西,或者任何需要文件的东西。资源不再是文件。它们是jar中的字节包,只有类装入器知道如何检索

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

如果要直接处理资源中的数据(通常是从文件中读取数据),可以使用方法
ClassLoader.getResourceAsStream(String)

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

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

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

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

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

这意味着您不能在它们上使用
FileReader
之类的东西,或者任何需要文件的东西。资源不再是文件。它们是jar中的字节包,只有类装入器知道如何检索

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

如果要直接处理资源中的数据(通常是从文件中读取数据),可以使用方法
ClassLoader.getResourceAsStream(String)

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

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

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

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

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

这意味着您不能在它们上使用
FileReader
之类的东西,或者任何需要文件的东西。资源不再是文件。它们是jar中的字节包,只有类装入器知道如何检索

如果资源是图像等,那么java可以使用这些资源