当前位置: 首页 > 面试题库 >

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

淳于飞文
2023-03-14
问题内容

每当在 以感叹号结尾的目录中运行可执行jar时,
getResourceAsStream 方法将返回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个测试用例。首先,从目录“ D:\ test123!@#”启动可执行jar,没有任何问题。其次,
从目录“ D:\ test123!@#!!!”启动可执行jar,出现问题。

是否不支持以感叹号结尾的目录?代码是否错误?

提前致谢。


问题答案:

可能由于此错误或Java错误数据库中的许多类似错误中的任何一个:

http://bugs.sun.com/view_bug.do?bug_id=4523159

原因是jar URL中的“!/”被解释为JAR文件名和JAR自身内的路径之间的分隔符。如果目录名称以!结尾,则目录末尾的“!/”字符序列将被错误地解释。就您而言,您实际上是在尝试使用以下URL访问资源:

jar:文件:/// d:/ test1231 @#!!! /test.jar!/images/Logo.png

该漏洞已经开放了将近12年,并且不太可能得到修复。
实际上,我不知道如何在不破坏其他事物的情况下进行修复。该
问题是设计决定使用!
在JAR文件的URL方案中作为具有特殊含义的字符(分隔符):

jar:<URL for JAR file>!/<path within the JAR file>

由于感叹号是URL中允许使用的字符,因此它既可能出现在JAR文件本身的URL中,也可能出现在JAR文件中的路径中,
因此在某些情况下无法找到实际的“!/”分隔符。 。



 类似资料:
  • 问题内容: 查看数据库中的V $ SQL,我刚发现一个奇怪的查询,看起来像: 有人知道语法@!的含义吗? 我以前从未在Oracle中见过类似的东西 谢谢 问题答案: 这是源自远程数据库的查询。使用@DB_NAME语法在远程数据库上的查询中引用了您在V $ SQL中看到此查询的数据库 远程数据库已将查询推送到您的数据库中以便执行,但是要回答该查询,您的数据库需要从远程数据库中拉回一些信息。这是@!进

  • 问题内容: 我正在阅读此查询,遇到了我不明白的那一行 FETT列表是一个表 FETT搜索是FETT列表中的一列 有人可以解释感叹号的含义吗? 谢谢 问题答案: 通常,您会在MS Access代码中看到此信息(对于感叹号,这是SQL Server的句点)。您可以通过table.column来引用列,或者如果为表赋予别名,则可以通过alias.column来引用。如果要在使用联接时特定于表,则可以执行

  • 在Kotlin中,单个感叹号意味着什么?我见过几次,特别是在使用Java API时。但我在文档中和StackOverflow上都找不到它。

  • 本文向大家介绍Eclipse项目有红感叹号的解决方法,包括了Eclipse项目有红感叹号的解决方法的使用技巧和注意事项,需要的朋友参考一下 Eclipse项目中为什么会有红感叹号,具体分析一下 【问题原因】:工程中classpath中指向的包路径错误 【解决办法】:右键项目名称 BuildPath ---> Configure Build Paht...中,然后上面有几个选项卡找到 Librari

  • 从…起https://source.dot.net/#System.Private.CoreLib/Hashtable.cs,475: 它看起来像两个零原谅运算符。有相关文件吗?

  • 问题内容: 我刚刚注意到,我所有的路径中的井号(#!)后都有一个感叹号。我不确定如何以及为什么获得它们,因为今天早些时候我没有它们。 如果有什么办法可以摆脱它们,那么如果有人可以向我解释一下(以及我如何拥有它们),我将不胜感激。 因此,到目前为止,我发现的唯一解决方案是手动将感叹号放在应用程序中的每个href上,但这使我很烦,我也不知道该怎么办。 我用yeoman生成器生成了我的应用,而我的app