从路径中删除冗余

时间:2013-05-14 01:33:17

标签: java path

来自Java教程:http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

  

以下示例均包含裁员:

/home/./joe/foo
/home/sally/../joe/foo
  

normalize方法删除任何冗余元素,包括   任何 ”。”或“目录/ ..”出现。前面两个例子   标准化为:

 /home/joe/foo

这两条“冗余”路径指向哪里,它们如何像这样被“规范化”?

3 个答案:

答案 0 :(得分:4)

首先,.表示当前目录,..表示目录。在

/home/./joe/foo

.指向/ home,因为当前目录在该上下文中是“home”。作为另一个例子,这些是相同的

/foo/././././.
/foo

/home/sally/../joe/foo

/ sally / ..是多余的。这就像说,“进入这个目录,然后退后一步”。它与此相同:

/home/joe/foo

答案 1 :(得分:1)

名称“路径”比您想象的更为文字。如果您将文件系统视为以/为根的树,那么每个路径元素代表您在离开根时向下走的选择。 /home/joe/foo表示

  1. 从根
  2. 开始
  3. 在根目录中转到home
  4. 然后在home内转到joe
  5. 然后在joe内转到foo
  6. 路径/home/sally/../joe/foo表示

    1. 从根
    2. 开始
    3. 在根目录中转到home
    4. 然后在home内转到sally
    5. 然后再返回一级(..)再到home
    6. 然后在home内转到joe
    7. 然后在joe内转到foo
    8. 所以你可以看到两条路径让你到达同一个地方。

      单个点表示“停留在同一个地方”,因此可以删除由.组成的路径元素。

答案 2 :(得分:0)

您可以拆分路径wrt“/”并在此之后进行处理。

String[] arr = path.split("/");
for(int i = 0; i < arr.length; i++){
    if(arr[i].equals("."))
        arr[i] = "";
    else if(arr[i].equals("..")){
        boolean changed = false;int j = i - 1;
        while(arr[j].equals(""))
            j--;
        if(j >= 0)
            arr[j] = "";
    }
}

这将删除多余的元素,然后再次组合数组。