Java 从类读取资源与从类装入器读取资源有什么区别?

Java 从类读取资源与从类装入器读取资源有什么区别?,java,jar,classloader,Java,Jar,Classloader,我试图读取一个文本文件“text.txt”,它作为jar文件的一部分打包在根目录下。在一种情况下,我的代码调用class.getResourceAsStream(“/test.txt”),在另一种情况下,我的代码调用class.getClassLoader().getResourceAsStream(“/test.txt”) 第一个调用获得了正确的数据,但第二个调用没有得到任何数据。有什么想法吗 public static void main(String[] args) { InputStr

我试图读取一个文本文件“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中的类/资源尚未加载吗?事实上,我得到了一个空指针异常(输入流为空)


你知道发生了什么吗?

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

您可以使用
`
或单击顶部的
{}
按钮将内联代码放在代码块中。对不起,伙计们,这是对我的格式的抱怨,我已经做了4空格的事情,仍然不走运。调试的一种方法是调用
xxx.getResource(“/”)
,它应该告诉您在哪里查找要流的资源。@BevynQ当我对第一个方法执行此操作时,我得到jar:file:/C:/test cp/libs/testcp-SNAPSHOT-0.0.1.jar/test.txt。对于第二个方法,我得到null。这仍然不能解释为什么一个是有效的,一个是空的。你是对的,当我从xxx.class.getClassLoader().getResourceAsStream(“test.txt”)中删除“/”时,这两个方法都可以工作。