简单Java程序:
public static String loadText(String file) {
StringBuilder finalString = new StringBuilder();
InputStream in = null;
BufferedReader reader = null;
InputStreamReader isr = null;
try{
System.out.println("Text File: " + file);
// Version 1
//URL url = Thread.currentThread().getClass().getResource(file);
//in = url.openStream();
// Version 2
in = Class.class.getResourceAsStream(file);
isr = new InputStreamReader(in);
reader = new BufferedReader(isr);
String line;
while((line = reader.readLine()) != null) {
finalString.append(line).append("//\n");
}
}
catch(IOException e) {
e.printStackTrace();
System.exit(-1);
}
finally {
try {
if (isr != null) { isr.close(); }
if (reader != null) { reader.close(); }
if (in != null) { in.close(); }
} catch (IOException e) { e.printStackTrace(); }
}
return finalString.toString();
}getResource和getResourceAsStream方法在JDK 8(java-8-OpenJDK-AMD 64)中运行良好,但它们总是在JDK 11中返回null。
问题:为什么?我怎么才能解决这个问题?
发布于 2019-01-03 12:20:46
我已经在MacOS上尝试过openjdk 8和11的应用程序,但两者都不能使用。我认为您需要查看1和2,以了解getResourceAsStream是如何工作的。
TLDR:
/开头),则class.getResourceAsStream()在提供的路径中搜索。class.getResourceAsStream()在与包名相对应的构造路径中搜索,其中点被用斜杠替换。因此,它是否起作用取决于两件事:
file是否与类位于同一个包中?基本上,在您提供的示例中,如果路径不是绝对的,则它永远无法工作,因为Class.class.getResourceAsStream()总是解析到java/lang/<file>的路径,因此您的文件必须位于系统包中。因此,您必须使用<MyClass>.class.getResourceAsStream(),或者使用绝对路径。
更新
因为Java 9在命名模块中的类上调用getResourceXXX只会找到该模块中的资源,所以它不会像以前版本那样搜索类路径。因此,当您使用Class.class.getResourceAsStream()时,它将尝试在包含java.lang.Class的模块(即java.base模块)中定位资源。显然,您的资源不在该模块中,因此它返回null。
您必须让java 9+搜索模块中的文件,这很可能是一个“未命名模块”。您可以通过将Class更改为模块中定义的任何类来做到这一点,以便使java使用正确的类加载器。
发布于 2020-08-12 09:03:24
还有一种使用ClassLoader的解决方案
ClassLoader.getSystemResourceAsStream(file)所有地点的货物。我使用它从JAR文件中加载资源,JAR文件只包含资源,没有可执行代码,所以前面的技巧无法工作,因为JAR中没有SomeClass来执行SomeClass.class.getResourceAsStream()
我只是不明白内部结构,我也必须改变文件的路径。
我在JAR存档的根目录中有带有"my-file.txt“文件的JAR文件。
对于java 8来说,这是可行的。
Class.class.getResourceAsStream("/my-file.txt");对于java 11,即使文件位于根路径,我也必须删除前面的/。
ClassLoader.getSystemResourceAsStream("my-file.txt");https://stackoverflow.com/questions/54021754
复制相似问题