82855 AI Apple Watch CentOS Eclipse H700 iCal iOS iPad iPhone iphone4 iTunes Java Javascript linux Mac MBP ML MySQL Oracle Parallels Desktop RAID redmine Rocky Linux RockyLinux screen 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 条评论