【发布时间】:2013-12-02 09:06:52
【问题描述】:
我正在尝试读取作为 jar 文件的一部分打包在根目录下的文本文件“text.txt”。在一种情况下,我的代码调用class.getResourceAsStream("/test.txt"),在另一种情况下,我的代码调用class.getClassLoader().getResourceAsStream("/test.txt")。
第一次调用得到正确的数据,但第二次没有得到任何东西。有什么想法吗?
public static void main(String[] args) {
InputStream is = null;
try {
is = TestLoadResourcesByClass.class.getResourceAsStream("/test.txt");
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer);
System.out.println(writer.toString());
} catch(Exception ex) {
ex.printStackTrace();
} finally {
if(null != is) { try { is.close(); } catch(Exception ex) { } }
}
}
public static void main(String[] args) {
InputStream is = null;
try {
is = TestLoadResourcesByClassLoader.class.getClassLoader().getResourceAsStream("/test.txt");
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer);
System.out.println(writer.toString());
} catch(Exception ex) {
ex.printStackTrace();
} finally {
if(null != is) { try { is.close(); } catch(Exception ex) { }
}
}
假设我有 2 个 jar 文件
- first.jar : 包含 TestLoadResourcesByClass.class(读取 test.txt 的代码)
- second.jar : 在根目录下包含“test.txt”
然后我按如下方式运行我的代码
java -cp first.jar;second.jar;commons-io-2.4.jar test.TestLoadByClass
我在控制台也没有输出。那是因为 second.jar 中的类/资源尚未加载吗?事实上,我得到一个空指针异常(输入流为空)。
知道发生了什么吗?
【问题讨论】:
-
您可以使用
`或点击顶部的{}按钮将内联代码放入代码块中。 -
对不起伙计们,抱怨我的格式,我已经做了 4 个空格的事情,仍然没有运气。
-
一种调试方法是调用
xxx.getResource("/"),它会告诉您在哪里寻找要流式传输的资源。 -
@BevynQ 当我为第一种方法执行此操作时,我得到 jar:file:/C:/test-cp/libs/testcp-SNAPSHOT-0.0.1.jar!/test.txt。对于第二种方法,我得到空值。仍然不能解释为什么一个是有效的,一个是空的。
标签: java jar classloader