【问题标题】:Access a resource outside a jar from the jar从 jar 访问 jar 外的资源
【发布时间】:2016-12-29 02:30:04
【问题描述】:

我正在尝试从 jar 文件中访问资源。资源位于 jar 所在的同一目录中。

my-dir:
 tester.jar
 test.jpg

我尝试了不同的方法,包括以下内容,但每次输入流都为空:

[1]

String path = new File(".").getAbsolutePath();
InputStream inputStream = this.getClass().getResourceAsStream(path.replace("\\.", "\\") + "test.jpg");

[2]

File f = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
InputStream inputStream = this.getClass().getResourceAsStream(f.getParent() + "test.jpg");

你能给我一些提示吗?谢谢。

【问题讨论】:

  • getResourceAsStream 从 jar 中获取资源。 docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
  • "getResourceXXX" 将从类路径加载资源,您需要将 jpg 作为文件打开或将 my-dir 添加到类路径中。
  • 您是否尝试过拆分代码,这样您至少可以确定您获得了 .jpg 文件的正确路径?
  • @LarsKristensen - 我确实打印了 .jpg 的路径,使用选项 [1] 似乎是正确的
  • this 可能会有所帮助。

标签: java inputstream getresource


【解决方案1】:

如果您确定您的应用程序的当前文件夹是 jar 的文件夹,您可以直接调用 InputStream f = new FileInputStream("test.jpg");

getResource 方法将使用类加载器加载内容,而不是通过文件系统。这就是您的方法(1)失败的原因。

如果包含*.jar 和图像文件的文件夹在类路径中,则可以像在默认包中一样获取图像资源:

class.getClass().getResourceAsStream("/test.jpg");

注意:图像现在加载到类加载器中,只要应用程序运行,如果再次加载,图像就不会从内存中卸载和提供。

如果类路径中没有给出包含 jar 文件的路径,那么获取 jarfile 路径的方法是好的。 但随后只需通过 URI 直接访问文件,方法是在文件上打开一个流:

URL u = this.getClass().getProtectionDomain().getCodeSource().getLocation();
// u2 is the url derived from the codesource location
InputStream s = u2.openStream();

【讨论】:

    【解决方案2】:

    使用this tutorial 帮助您创建指向 jar 文件中单个文件的 URL。

    这是一个例子:

    String jarPath = "/home/user/myJar.jar";
    String urlStr = "jar:file://" + jarPath + "!/test.jpg";
    InputStream is = null;
    try {
        URL url = new URL(urlStr);
        is = url.openStream();
        Image image = ImageIO.read(is);
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    finally {
        try {
            is.close();
        } catch(Exception IGNORE) {}
    }
    

    【讨论】:

    • OP 明确表示 jar 和 jpg 在同一个文件夹中。他不是在问如何访问 INSIDE jar 中的资源。
    猜你喜欢
    • 2012-04-27
    • 2012-05-11
    • 2011-02-08
    • 2015-09-06
    • 1970-01-01
    • 2012-11-28
    • 2018-01-06
    • 2015-06-07
    相关资源
    最近更新 更多