0

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

以下示例都包括冗余:

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

normalize 方法删除任何冗余元素,其中包括任何“.”。或“目录/..”出现。前面的两个示例都归一化为:

 /home/joe/foo

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

4

3 回答 3

4

首先,.表示当前目录并..表示上一个目录。在

/home/./joe/foo

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

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

/home/sally/../joe/foo

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

/home/joe/foo
于 2013-05-14T01:36:30.713 回答
1

“路径”这个名字比你想象的更直接。如果您将文件系统视为以 为根的树/,那么每个路径元素都代表您向下走时的选择,远离根。 /home/joe/foo方法

  1. 从根开始
  2. 在根内转到home
  3. 然后在里面homejoe
  4. 然后在里面joefoo

路径的/home/sally/../joe/foo意思

  1. 从根开始
  2. 在根内转到home
  3. 然后在里面homesally
  4. 然后再上一层(the ..home
  5. 然后在里面homejoe
  6. 然后在里面joefoo

因此,您可以看到两条路径将您带到同一个地方。

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

于 2013-05-14T07:36:12.750 回答
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] = "";
    }
}

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

于 2013-05-14T07:50:28.797 回答