java - 无法打开以感叹号 (!) 结尾的目录中的资源

标签 java resources classpath classloader javax.imageio

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!@#!!!”启动的,有问题。

不支持以感叹号结尾的目录吗?代码有错吗?

提前致谢。

Error when running the executable jar in a directory ending with !

最佳答案

可能是因为这个错误或 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/

相关文章:

Java 不变异常

java - java.security.Key.getEncoded() 是否以 DER 编码格式返回数据?

Xcode:项目和目标,向目标添加资源?

WAR 文件的 Java 类路径补丁概念

java - 在类路径中指定 log4j

java - Java 不区分大小写的正则表达式值

Maven 资源过滤破坏下载

c++ - 使用文本框的数字 ID 来初始化 DoDataExchange?

Tomcat 类路径

java - 如何仅显示 Room 数据库中存储的特定年份的日期?