我正在尝试读取一个文本文件“text.txt”,作为我的jar文件的一部分打包在根目录下。在一种情况下,我的代码调用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文件
然后我运行我的代码如下
java -cp first.jar;second.jar;commons-io-2.4.jar test.TestLoadByClass
我也没有在控制台输出。是因为second.jar中的类/资源尚未加载?实际上,我得到一个空指针异常(输入流为空)。
关于发生了什么的任何想法?
答案 0 :(得分:2)
在Class.getResourceAsStream的javadoc中对此进行了解释。该方法从资源名称的开头删除/
,以创建它为ClassLoader.getResourceAsStream提供的绝对资源名称。如果你想直接调用ClassLoader.getResourceAsStream,那么你应该在开始时省略/
。