getResource().getPath()返回路径带%20问题

问题描述

最近在品优购项目中开发图片上传服务时,调试过程中毫无问题,但是一旦发布到项目中使用,就崩溃掉,崩溃提示信息:

java.io.FileNotFoundException: D:\Java%20Project\pingyougou-parent\pinyougou-manager-web\target\classes\config\fdfs_client.conf (系统找不到指定的路径。)

由此我们可以看出一些眉目:提示中的路径中出现了一个%20,对比我们的实际路径

image-20200729192146357

发现这个%20可能代表空格,但是系统找路径时并不能自动转化。

对此我们有了思路,应该是每一个地方转化时出错了,我们按照程序一步步深入展开。

我们发现FastDFS文件服务器时需要读取配置文件的路径,采用了this.getClass().getResource(“/”).getPath()的方法来取得存放 class 的物理路径。

image-20200729192552264

经过查阅资料发现:TestURL().class.getResource("").getPath()或TestURL().class.getResource("").getFile()获得的路径,不能被FileReader()和FileWriter()直接应用。原因是URL对空格,特殊字符(%,#,[]等)和中文进行了编码处理。

解决方法

有解决方法(1),使用repaceAll("%20",’ ')替换后,只能解决空格问题。但是路径中包含%和中文就不行了。
有解决方法(2),使用URLDecoder.decode(str,“UTF-8”)解码,但是只能解决一部分,若路径中含有+,也是不能解决的,原因是URL并不是完全用URLEncoder.encode(str,“UTF-8”)编码的,+号被解码后,却变成了空格。
方法(3),可以解决所有的问题,用TestURL().class.getResource("").toURI().getPath(),但是需要处理URISyntaxException异常,比较麻烦点。

这里推荐使用方法3,我们直接添加toURI()方法即可解决。

image-20200729191436363

中…(img-7gJPTEoD-1596074275908)]

getResource().getPath()返回路径带%20问题_第1张图片

你可能感兴趣的:(随笔,java)