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

相关文章:

java - Sftp 出站网关多个删除请求在第一个 "File not found"问题后卡住

javascript - 获取调用某个函数的脚本标签

Java 项目 : should . 类路径 .project 文件被提交到存储库?

eclipse - m2eclipse 对类路径的多个依赖项

java - getResourceAsStream 返回 null

java - jdk.dynalink 在 Java 9 的引导类路径中不可见

java - jackson 在 momentJS 中使用的奇怪时间戳值给出了错误的年份

Java LWJGL 多剪刀测试

java - 如何在事务开始之前或提交之前执行操作?

spring-boot - 为什么我需要在构建之前手动运行清理?