最后更新时间:2015-03-12
这个Java Path接口是中Java 6或者Java 7中Java NIO 2更新的一部分。这个Java Path接口中Java 7中被添加到了Java NIO中。这个Path接口被放置到了java.nio.file包中,以至于这个Java Path的完整定义名称是:java.nio.file.Path。
一个Java Path实例显示了一个文件系统的路径。一个路径可以指向一个文件或者一个目录。一个路径可以是一个绝对路径或者是相对的路径。一个绝对路径包含来自于文件系统的根到它指向的文件或者目录的完整路径。一个相对路径包含了一个对于文件或者目录相对一些其他路径的路径。相对路径听起来可能有点混乱。不要担心。我将会在这一部分中详细的解释相对路径的含义。
不要在一些操作系统中把一个文件系统同这个path环境变量混淆。这个java.nio.file.Path接口对于path环境变量什么也没有做。
在许多方面,这个java.nio.file.Path接口跟java.io.File类是相似的,但是这里有一些很小的不同。在许多场景下,你可以用Path接口的使用代替File类的使用。
创建一个Path实例
为了使用一个java.nio.file.Path实例,你必须创建一个Path实例。你使用中Paths类中(java.nio.file.Paths)命名的Paths.get()的静态方法创建一个Path实例。这里有一个例子:
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathExample {
public static void main(String[] args) {
Path path = Paths.get("c:\\data\\myfile.txt");
}
}
注意中上面例子中的两个import语句。为了使用Path接口和Paths类,我们必须首先导入他们。
第二,注意这个Paths.get("c:\\data\myfile.txt")方法调用。它是调用Paths.get()方法创建Path实例。换句话说,这个Paths.get()方法是一个工厂方法去创建Path实例。
创建一个绝对路径
创建一个绝对路径是通过调用Paths.get()工厂方法伴随着一个绝对路径的文件作为参数被做的。这里有一个例子:
Path path = Paths.get("c:\\data\\myfile.txt");
这个绝对路径是c:\data\myfile.txt。这两个“\”字符中java字符串中是需要的,因为这个“\”是一个转义字符,意味着下面的字符告诉什么字符在这个字符串中是真正的位于这个位置中。通过写“\\”,你告诉java编译器去写一个单独的“\”字符进入到这个字符串中。
上面的路径是一个Windows文件系统路径。在一个Unix系统(Linux,MacOS,FreeBSD),上面的路径应该像这样:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
现在这个绝对路径是/home/jakobjenkov/myfile.txt。
如果你找Windows机器上使用这种路径(以一个“/”开始的路径),这个路径对于当前的驱动将会被解释为相对路径。例如,这个路径:
/home/jakobjenkov/myfile.txt
有可能会被解释为位于C盘中。然后这个路径将会响应成这样的一个完整的路径:
C:/home/jakobjenkov/myfile.txt
创建一个相对路径
一个相对路径是从一个路径(这个基础路径)指向到一个目录或者文件的路径。一个相对路径的完整路径(绝对路径)是通过使用一个相对路径结合基本路径得到的。
这个Java NIO的Path类也可以用来同相对路径工作。你可以使用这个Paths.get(basePath,relativePath)方法创建一个相对路径。这里有两个相对路径的例子:
Path projects = Paths.get("d:\\data", "projects");
Path file = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");
第一个例子创建了一个Java Path实例,它指向了这个路径(目录):d:\data\projects。
第二个例子创建了一个Path实例,它指向了这个路径(文件):d:\data\projects\a-project\myfile.txt。
当同相对路径一起工作的时候,这里有两个特殊的编码你可以使用中路径字符串中。这些编码是:
- .
- ..
这个“.”编码意味着“当前目录”。例如,如果你想这样创建一个相对路径:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
然后这个绝对路径相对于Java Path实例将会是应用程序正在执行上面代码的目录。
如果这个“.”被使用在路径字符串的中间,它意味着和路径一样的目录正在指向那个点。这里有一个例子:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
这个路径将会指向下面这个路径:
d:\data\projects\a-project
这个“..”编码意味着“父目录”或者“一个上级目录”。这里有一个例子:
Path parentDir = Paths.get("..");
被这个例子创建的Path实例将会相对于当前应用程序执行的当前目录的上级目录。
如果你使用这个“..”编码中路径字符串的中间,它将会相对于当前目录的上级目录。例如:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
通过这个例子创建的Java Path实例将会对应这个绝对目录:
d:\data\projects\another-project
这个“.”和“..”码也会结合中两个字符串的Paths.get()方法中使用。实例如下:
Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");
Path path2 = Paths.get("d:\\data\\projects\\a-project",
"..\\another-project");
这里有更多的方式使用Java NIO的Path类被使用来工作。中这个教程的后面将会学到更多。
Path.normalize()
Path接口的这个normalize方法可以标准化一个路径。标准化意味着它可以移除所有在路径字符串中的这个"."和“..”符号,并且解析这个路径字符串指向的什么路径。这里有一个例子:
String originalPath =
"d:\\data\\projects\\a-project\\..\\another-project";
Path path1 = Paths.get(originalPath);
System.out.println("path1 = " + path1);
Path path2 = path1.normalize();
System.out.println("path2 = " + path2);
这个Path例子首先在中间使用一个“..”符号创建一个路径字符串。然后这个例子通过这个路径字符串创建一个Path实例,并且打印这个Path实例(实际上它打印了Path.toString())。
这个例子然后中创建的Path实例上调用normalize方法,这样将会返回一个新的Path实例。这个新的,标准化的Path实例然后也会打印出来。
下面是上面的例子打印的结果:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
正如你看到的,这个被标准化的路径不会包含这个a-project\..的部分,因为这个是多余的。这个被移除的部分什么也不会添加到最终的绝对路径中。