getResourceAsStream -每当在以感叹号结尾的目录中运行可执行 jar 时,方法都会返回 null。
对于以下示例,我有一个具有以下目录结构的 Eclipse 项目:
src\ (Source Folder)
main\ (Package)
Main.java
res\ (Source Folder)
images\
Logo.png
我正在阅读Logo.png,如下所示:
public static void main(String[] args) throws IOException {
try (InputStream is = Main.class.getClassLoader().getResourceAsStream("images/Logo.png")) {
Image image = ImageIO.read(is);
System.out.println(image);
}
}
请参阅附件中的 2 个测试用例。首先,可执行jar从目录“D:\test123!@#”启动,没有任何问题。其次,可执行jar是从目录“D:\test123!@#!!!”启动的,有问题。
不支持以感叹号结尾的目录吗?代码有错吗?
提前致谢。
最佳答案
可能是因为这个错误或 Java 错误数据库中的许多类似错误中的任何一个:
http://bugs.sun.com/view_bug.do?bug_id=4523159
原因是 jar URL 中的“!/”被解释为 JAR 文件名和 JAR 本身内的路径之间的分隔符。如果目录名称以 ! 结尾,则目录末尾的“!/”字符序列将被错误解释。在您的情况下,您实际上正在尝试访问具有以下 URL 的资源:
jar:file:///d:/test1231@#!!!/test.jar!/images/Logo.png
该错误已存在近 12 年,而且不太可能得到修复。实际上我不知道如何在不破坏其他东西的情况下修复它。问题是设计决定使用!作为 JAR 文件的 URL 方案中具有特殊含义的字符(分隔符):
jar:<URL for JAR file>!/<path within the JAR file>
由于感叹号是 URL 中允许的字符,因此它可能同时出现在 JAR 文件本身的 URL 中以及 JAR 文件内的路径中,从而在某些情况下无法找到实际的“!/”分隔符。
关于java - 无法打开以感叹号 (!) 结尾的目录中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51170758/