从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 

我真的不知道为什么,但如果我改变,我发现一些testing

 file = new File(getClass().getResource("/file.txt").toURI()); 

 file = new File(getClass().getResource("/folder/file.txt").toURI()); 

那么它的作用是相反的(它在jar中工作,但不是eclipse)。

我正在使用Eclipse和我的文件在文件夹是一个类文件夹。

而不是试图将资源作为文件来处理,只需要ClassLoader通过getResourceAsStream返回资源的InputStream即可 :

 InputStream in = getClass().getResourceAsStream("/file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

只要file.txt资源在类path中可用,那么无论file.txt资源是位于classes/目录中还是位于jar这种方法都将以相同的方式工作。

URI is not hierarchical ,因为jar文件中的资源的URI看起来像这样: file:/example.jar!/file.txt 。 你不能阅读一个jar文件(一个zip文件),就像它是一个普通的旧文件 。

这可以通过以下答案来解释:

  • 如何从Java jar文件读取资源文件?
  • Java Jar文件:使用资源错误:URI不是分层的

如果你想作为一个文件阅读,我相信还有一个类似的解决scheme:

  ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("file/test.xml").getFile()); 

要访问jar文件,你有两个select:

  • 将文件放在与你的包名相匹配的目录结构中(在解压缩.jar文件后,它应该和.class文件在同一个目录中),然后使用getClass().getResourceAsStream("file.txt")来访问它

  • 将文件放在根目录(在解压缩.jar文件之后,它应该位于根目录下),然后使用Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")来访问它

jar被用作插件时,第一个选项可能不起作用。

你也可以使用java.nio。 下面是一个示例,用于在classpath中resourcePath中的文件中search文本:

 new String(Files.readAllBytes(Paths.get(getClass().getResource(resourcePath).toURI()))) 

确保您使用正确的分隔符。 我用File.separatorreplace了相对path中的所有/ 。 这在IDE中正常工作,但在构buildJAR中无效。

我之前有过这个问题,我做了加载的备用方法。 基本上第一种方式在.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; } } 

如果使用spring,那么可以使用以下方法从src / main / resources中读取文件:

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.springframework.core.io.ClassPathResource; public String readFile() { StringBuilder result = new StringBuilder(""); ClassPathResource resource = new ClassPathResource("filename.txt"); try (InputStream inputStream = resource.getInputStream()) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine()) != null) { result.append(line); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return result.toString(); }