从jar中读取资源文件

从jar中读取资源文件

我想从我的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,我的文件夹在一个类文件夹中。



湖上湖
浏览 1473回答 4
4回答

开心每一天1111

而不是尝试将资源作为文件来处理,而只是要求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不是分层的

梵蒂冈之花

要访问jar中的文件,您有两个选择:将文件放在与包名匹配的目录结构中(在解压缩.jar文件后,它应该与.class文件位于同一目录中),然后使用 getClass().getResourceAsStream("file.txt")将文件放在根目录下(在解压缩.jar文件后,它应该在根目录中),然后使用它来访问它 Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")当jar用作插件时,第一个选项可能不起作用。

慕容3067478

如果你想读作文件,我相信仍有类似的解决方案:    ClassLoader classLoader = getClass().getClassLoader();     File file = new File(classLoader.getResource("file/test.xml").getFile());

炎炎设计

之前我遇到过这个问题,我做了后备加载方式。基本上第一种方式在.jar文件中工作,第二种方式在eclipse或其他IDE中工作。public class MyClass {     public static InputStream accessFile() {         String resource = "my-file-located-in-resources.txt";         // this is the path within the jar file         InputStream input = MyClass.class.getResourceAsStream("/resources/" + resource);         if (input == null) {             // this is how we load file within editor (eg eclipse)             input = MyClass.class.getClassLoader().getResourceAsStream(resource);         }         return input;     }}
打开App,查看更多内容
随时随地看视频慕课网APP