最近我们有一个 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 条评论
[…] 下面来自https://www.cumt.org//blog/493里的内容: […]
[…] 下面来自https://www.cumt.org//blog/493里的内容: […]
[…] 下面来自https://www.cumt.org//blog/493里的内容: […]
原来20%是这个意思。