从类中读取资源与类加载器之间有什么区别?

时间:2013-11-19 00:40:02

标签: java jar classloader

我正在尝试读取一个文本文件“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文件

  • 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中的类/资源尚未加载?实际上,我得到一个空指针异常(输入流为空)。

关于发生了什么的任何想法?

1 个答案:

答案 0 :(得分:2)

Class.getResourceAsStream的javadoc中对此进行了解释。该方法从资源名称的开头删除/,以创建它为ClassLoader.getResourceAsStream提供的绝对资源名称。如果你想直接调用ClassLoader.getResourceAsStream,那么你应该在开始时省略/