我想从我的jar中读取资源,如下所示:
File file; file = new File(getClass().getResource("/file.txt").toURI()); BufferredReader reader = new BufferedReader(new FileReader(file)); //Read the file
并且它在Eclipse中运行时工作正常,但是如果我将它导出到jar中运行它就会出现IllegalArgumentException:
Exception in thread "Thread-2" java.lang.IllegalArgumentException: URI is not hierarchical
而且我真的不知道为什么,但经过一些测试我发现如果我改变了
file = new File(getClass().getResource("/file.txt").toURI());
至
file = new File(getClass().getResource("/folder/file.txt").toURI());
然后它的工作正好相反(它适用于jar而不是eclipse).
我正在使用Eclipse,我的文件夹在一个类文件夹中.
要访问jar中的文件,您有两个选择:
将文件放在与包名匹配的目录结构中(在解压缩.jar文件后,它应该与.class文件位于同一目录中),然后使用 getClass().getResourceAsStream("file.txt")
将文件放在根目录下(在解压缩.jar文件后,它应该在根目录中),然后使用它来访问它 Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")
当jar用作插件时,第一个选项可能不起作用.
而不是尝试将资源作为文件来处理,而只是要求ClassLoader通过getResourceAsStream返回资源的InputStream:
InputStream in = getClass().getResourceAsStream("/file.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
只要file.txt
资源在类路径上可用,那么无论file.txt
资源是在classes/
目录中还是在内部,这种方法都将以相同的方式工作jar
.
之所以URI is not hierarchical
发生这种情况,是因为jar文件中资源的URI看起来像这样:file:/example.jar!/file.txt
.您无法读取jar
(zip
文件)中的条目,就像它是一个普通的旧文件.
这可以通过以下答案得到很好的解释:
如何从Java jar文件中读取资源文件?
Java Jar文件:使用资源错误:URI不是分层的