【发布时间】:2019-01-03 11:52:12
【问题描述】:
简单的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-amd64) 中运行良好,但在 JDK 11 中它们总是返回 null。
问题:为什么?我该如何解决这个问题?
- 操作系统:Linux Mint 19 Tara x64
- IDE:Eclipse 2018-12 (4.10.0)
【问题讨论】:
-
您使用的“文件”参数的典型值是多少?
-
请检查this问题
-
Class.class.getResourceAsStream(...) 将尝试在 java.base 模块中定位资源。将“Class.class”替换为您的类的名称,以便它在您的模块(或类路径)中找到它。
-
进一步,值得学习try-with-resources statement...
-
@Alexey a) try-with-resource 已成为该语言的一部分已有十年之久,Java 开发人员无需进一步解释即可理解。它与任何其他高级语言结构没有什么不同,例如for-each 循环或字符串连接,或使用 OOP 概念。冗长并不意味着“不言自明”。 b) 向后兼容什么?您问的是关于 Java 11 的问题,但坚持要兼容 Java 6 甚至更早版本? c) 使用 try-with-resource 在哪些方面会妨碍调试?