获取相对路径前是否需规范化路径?求移除normalize的失败测试用例
Java Path移除normalize()导致relativize出问题的测试用例
最典型的测试场景就是路径里包含.(当前目录)、..(上级目录)这类冗余片段的时候,normalize()会先把这些没用的片段清掉,直接调用relativize()就会带着这些冗余逻辑计算,结果就不一样了。
可直接运行的测试代码
import java.nio.file.Path; import java.nio.file.Paths; public class PathTest { public static void main(String[] args) { // 基准路径带../,绝对路径是正常子路径 Path pathBase = Paths.get("/home/user/docs/../"); Path pathAbsolute = Paths.get("/home/user/projects/code/"); // 先做normalize再relativize Path normalizedBase = pathBase.normalize(); Path normalizedAbsolute = pathAbsolute.normalize(); Path resultWithNormalize = normalizedBase.relativize(normalizedAbsolute); System.out.println("带normalize的结果: " + resultWithNormalize); // 输出projects/code // 直接relativize,跳过normalize Path resultWithoutNormalize = pathBase.relativize(pathAbsolute); System.out.println("不带normalize的结果: " + resultWithoutNormalize); // 输出../projects/code } }
结果差异原因
- 加了
normalize()之后,pathBase被清理成了/home/user,这时候计算相对路径,就是从/home/user到/home/user/projects/code,结果自然是projects/code。 - 没加
normalize()的话,pathBase还是/home/user/docs/../,relativize会把docs/../当成真实路径结构的一部分,计算时会多输出一个../,结果就变成../projects/code了。
移除normalize()的功能影响
- 如果你的输入路径可能带
.、..或者重复的//这类冗余内容,那肯定影响,算出来的相对路径会不符合预期。 - 如果输入的路径都是已经规范化好的(比如用户输入前已经清理过,或者是系统生成的标准路径),可能暂时看不出问题,但保不齐哪天出现异常路径,直接就会导致计算错误,属于潜在风险。
内容的提问来源于stack exchange,提问作者kevin222004
相关产品推荐
相关产品推荐

