【问题标题】:what is the difference between reading a resource from the class versus class loader?从类和类加载器中读取资源有什么区别?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 你是对的,当我从 xxx.class.getClassLoader().getResourceAsStream("test.txt") 中删除“/”时,这两种方法都有效。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2016-02-15
  • 2018-02-20
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多