You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取相对路径前是否需规范化路径?求移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:06:00