【问题标题】:Getting Resources from a jar: classloader vs class resourceasstream从 jar 中获取资源:类加载器与类资源流
【发布时间】:2011-11-25 11:13:42
【问题描述】:

我正在尝试实现一个方法,当调用该方法时,从加载类的 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 与从类调用有什么区别?

【问题讨论】:

    标签: java resources jar classpath classloader


    【解决方案1】:

    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 类文件夹。

    【讨论】:

    • 工作就像一个魅力!感谢您的帮助。
    【解决方案2】:

    可能所有类都由同一个 ClassLoader 实例加载。所以只要资源的路径不改变,你每次都会得到相同的资源。

    getResourceAsStream:

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

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多