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/17466261/