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

时间:2015-01-05 21:20:26

标签: java resources getresource

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

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

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

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

这正是我想要的,并且没有任何异常地访问res文件夹 - 在Eclipse中以及当我移动Jar文件旁边的资源文件夹时。

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

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

myClass().getResource()

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

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

对于漫无边际的问题,我很了解我对最终产品的要求,但是我对构建路径和课堂内部的引用感到困惑,我已经在网上搜索了很长时间,试图找出答案。

1 个答案:

答案 0 :(得分:3)

部署软件时,资源未部署为文件夹中的文件。它们作为应用程序jar的一部分打包。然后通过从jar内部检索它们来访问它们。类加载器知道如何从jar中检索东西,因此你使用类的类加载器来获取信息。

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

如果资源是像图像等的东西,那些知道如何访问资源URL的java类可以使用(也就是说,当jar在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) ); 应用于此类推文。

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

getResourceAsStream()

请注意,我使用的是Class而不是ClassLoader的{​​{1}}方法。两个版本在jar中查找资源的方式略有不同。请阅读ClassClassLoader的相关文档。