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;
}}添加回答
举报
