82855 AI Apple Watch CentOS Eclipse H700 iCal iOS iPad iPhone iphone4 iTunes Java Javascript linux Mac MBP ML MySQL Oracle OS X Parallels Desktop RAID redmine Rocky Linux Snow Leopard SQL SVN Thinkpad VMware VR Windows Windows 7 Windows 11 Word X40 东航 压缩算法 字体 导航 数据库 朗逸 签证 达美 闹钟

getResource().getPath()返回的路径空格变成了 %20


最近我们有一个 web 程序,为了取到配置文件的路径,采用了
this.getClass().getResource(“/”).getPath()
的方法来取得存放 class 的物理路径。本来测试的时候没问题,一发布崩溃掉了。究其原因是发布环境的 Tomcat 的安装目录带有空格,而 getPath 的返回值把空格给转换成了 “%20”。经过一番调查,原来是这是 Java 的一个历史悠久的 bug:

Bug ID: 4466485 getClass( ).getResource( ).getFile( ) returns file name with %20

此 bug 于 2001年6月被提出来,2002年11月最终关闭。
没有修复的原因是这样做会导致兼容性问题。
官方给出的解决方法是采用URI类再把它解码出来。

    URI uri = new URI(url.toString());
    FileInputStream fis = new FileInputStream(uri.getPath());

而这个bug是当初为了修复另一个 bug 的时候引入的:
Bug ID: 4359123 NoClassDefFoundError if ‘#’ anywhere in path

我们最终决定不用这个拐弯抹角的方法,干脆采用下面几种办法直接取得 Stream。

    ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
    Class.getResourceAsStream ("/some/pkg/resource.properties");
    ResourceBundle.getBundle ("some.pkg.resource");
 

《 “getResource().getPath()返回的路径空格变成了 %20” 》 有 4 条评论