java - 从 jar 访问 jar 外的资源

标签 java inputstream getresource

我正在尝试从 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");

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

最佳答案

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

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

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

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

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

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

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

关于java - 从 jar 访问 jar 外的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39081215/

相关文章:

java - getResourceAsStream() 找不到属性文件。检查 CLASSPATH 或类加载器

java - 有没有办法从由特定字符分隔的字符串中提取值?

Java 输入流被阻塞

java - 如何防止通过 AutoClose InputStream 关​​闭 InputStream

java - Class.getResource()返回null

android - getDrawable 返回 null

java - 如何在 Java 中等待条件而不会在信号后调用等待?

java - 如何使 TreeView 调整大小与父 ScrollPane 一样多?

java - 使用流 Java 8 转换 Map<K,V> 中的 List<V>

java - 将InputStream写入文件