从jar获取资源:classloader vs class resourceasstream

时间:2011-09-26 18:53:19

标签: java resources jar classpath classloader

我正在尝试实现一个方法,在调用时,从jar中加载类的特定资源中获取一个字符串。

例如:

import mypath.myclass; //from a jar
String result = gitid.getGitId(myclass.class);

在我正在使用的支持上:

InputStream is = null;
BufferedReader br = null;
String line;
is = c.getResourceAsStream("/com/file.text");

问题是我不断获得相同的资源,无论我给它什么课程。

我也尝试过:

is = c.getClassLoader().getResourceAsStream("/com/file.text");

这完全失败了。

我们非常感谢任何建议。

另外,从类加载器调用getResourceAsStream与类有什么区别?

2 个答案:

答案 0 :(得分:3)

Class.getResourceAsStream()获得ClassLoader个实例,与Class.getClassLoader()来电几乎相同。

您可以做的是获取给定类的URL并将类资源路径替换为文件的路径。例如,以下代码将从同一个jar返回资源:

  Class c = String.class;
  URL u = c.getResource('/' + c.getName().replace('.', '/') + ".class");
  String s = u.toString();
  URL url = new URL(s.substring(0, s.indexOf('!')) + "!/META-INF/MANIFEST.MF");
  InputStream is = url.openStream();

你必须单独处理不是jarred的类文件夹。

答案 1 :(得分:0)

可能所有类都由同一个ClassLoader实例加载。因此,只要资源的路径没有改变,您每次都会获得相同的资源。

getResourceAsStream

  

此方法委托此对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResourceAsStream(java.lang.String)。