如何在Java中从两个绝对路径(或URL)构建相对路径?

318

给定两个绝对路径,例如:

/var/data/stuff/xyz.dat
/var/data

如何创建一个相对路径,以第二个路径为基础?在上面的例子中,结果应该是:./stuff/xyz.dat


3
对于Java 7及更高版本,请查看@VitaliiFedorenko的答案。 - Andy Thomas
3
简短回答:Paths.get(startPath).relativize(Paths.get(endPath)).toString()(顺便说一句,在Java 8中,使用例如"../"的方式似乎可以正常工作,所以...) - Andrew
23个回答

-1

-1
private String relative(String left, String right){
    String[] lefts = left.split("/");
    String[] rights = right.split("/");
    int min = Math.min(lefts.length, rights.length);
    int commonIdx = -1;
    for(int i = 0; i < min; i++){
        if(commonIdx < 0 && !lefts[i].equals(rights[i])){
            commonIdx = i - 1;
            break;
        }
    }
    if(commonIdx < 0){
        return null;
    }
    StringBuilder sb = new StringBuilder(Math.max(left.length(), right.length()));
    sb.append(left).append("/");
    for(int i = commonIdx + 1; i < lefts.length;i++){
        sb.append("../");
    }
    for(int i = commonIdx + 1; i < rights.length;i++){
        sb.append(rights[i]).append("/");
    }

    return sb.deleteCharAt(sb.length() -1).toString();
}

-2

伪代码:

  1. 通过路径分隔符(“/”)拆分字符串
  2. 通过迭代拆分字符串的结果找到最大公共路径(因此您将在两个示例中得到“/var/data”或“/a”)
  3. return "." + whicheverPathIsLonger.substring(commonPath.length);

2
这个答案充其量只是一个hack。那Windows怎么办? - Qix - MONICA WAS MISTREATED

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接