4 回答
TA贡献1836条经验 获得超13个赞
而不是尝试将资源作为文件来处理,而只是要求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
文件)中的条目,就像它是一个普通的旧文件。
这可以通过以下答案得到很好的解释:
TA贡献1900条经验 获得超5个赞
要访问jar中的文件,您有两个选择:
将文件放在与包名匹配的目录结构中(在解压缩.jar文件后,它应该与.class文件位于同一目录中),然后使用
getClass().getResourceAsStream("file.txt")
将文件放在根目录下(在解压缩.jar文件后,它应该在根目录中),然后使用它来访问它
Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")
当jar用作插件时,第一个选项可能不起作用。
TA贡献1773条经验 获得超3个赞
如果你想读作文件,我相信仍有类似的解决方案:
ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("file/test.xml").getFile());
TA贡献1808条经验 获得超4个赞
之前我遇到过这个问题,我做了后备加载方式。基本上第一种方式在.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; }}
添加回答
举报