先上错误截图
根据错误信息可知,用于创建URI的字符串中出现了非法字符,截图中的非法字符是“二”后面有个空格。第一想法就是使用trim()方法剔除空格,但是仔细一想,这种处理方式只能剔除空格非法字符,却无法剔除中括号 [{}]
这样的非法字符,写法太死板。于是有了下面这种思路:
public String checkPath(String path){
try {
//如果URI能够正常被创建,则返回这个路径
return new URI(path).getPath();
}catch (URISyntaxException e){
//如果捕捉到创建URI的异常,则根据异常信息删掉这个非法字符
StringBuilder builder = new StringBuilder(path);
//递归判断剔除后的路径是否还有其它非法字符
return checkPath(builder.deleteCharAt(e.getIndex()).toString());
}
}
上述方法依然还有缺陷,就是当文件名中含有?#/
这些特殊含义的字符,URI的getPath()方法是无法返回正确路径的,因此还需要在调用上述方法之前,需提前一步处理文件名。
public String getPath(String dirPath, String fileName){
//剔除特殊含义的字符"?#/"
fileName = fileName.replaceAll("[?|#/]", "");
//返回路径
return dirPath + fileName;
}
经测试,运行完美。
注:URI不能使用URI.create()创建,从源码可知该方法是捕捉异常、但又不向上抛出,是无法被自己写的try cath捕捉的