Java Path是在JDK 1.6和JDK1.7中推出的。在JDK 1.7之后正式加入到NIO中。Path接口在java.nio.file包下,Path的完整路径名为java.nio.file.Path。
Java Path实例代表文件系统中的路径。Path可以指向任何文件或路径。Path可以是绝对路径,也可以是相对路径。绝对路径包含从文件系统根路径开始的完整路径。相对路径是文件或目录相对于其他文件的路径。相对路径听起来有点迷惑。不要担心,我会在Java NIO Path教程中进行详细地介绍。
不要将一些操作系统的path环境变量与文件系统的路径混淆。java.nio.file.Path接口与path环境变量一点关系也没有。
在许多种情况下,Java.nio.file.Path与java.io.path有点相像,但是它们之间也有一点的区别。尽管在许多情况下File类可以直接替换成Path。
创建Path实例
为了使用java.nio.file.Path实例,必须先创建一个Path实例。创建Path实例可以通过Path的静态方法Paths.get()方法,下面是一个例子:
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实例。换句话说,Path.get()方法是一个工厂方法来创建Path实例。
创建绝对Path
创建绝对Path是通过工厂方法Paths.pget()方法,方法的参数是文件的绝对路径。下面是一个创建绝对Path的例子:
Path path = Paths.get("c:\\data\\myfile.txt");
复制代码
绝对Path是==c:\data\myfile.txt.==。在Java中两上\是必须的,因为\是一个转义符号,它代表后面的字符按实际显示,不需要转义。写入两个\会告诉Java编译器在字符串中写入一个\。
以上的路径是Window的文件系统路径。在Unix系统中,以上的路径可以像这样:
Path path = Paths.get("/home/jakobjenkov/myfile.txt");
复制代码
现在的绝对路径是== /home/jakobjenkov/myfile.tx==
如果你在Windows系统中使用这种路径,路径为替换为相对当前驱动器来说。例如,路径
/home/jakobjenkov/myfile.txt
复制代码
可以被解析在C盘上。然后,路径的完整路径将会是
C:/home/jakobjenkov/myfile.txt
复制代码
创建相对Path
相对路径是一个Path相对于另一个文件或目录的路径。完整的Path是基Path加上相对Path。
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");
复制代码
第一个例子创建了一个指向d:\data\project目录的Path。第二个例子创建了一个指向d:\data\projects\a-project\myfile.txt文件的Path。
在使用相对Path时有两种特殊的Code在路径中使用。这些Code为:
- .
- ..
code .表示当前目录。例如,如果你创建了像这样的相对路径,像这样:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
复制代码
Path会指向当前运行代码的目录。
如果.出现在路径字符串的中间,它仅仅代表与当前目录相同的位置。Path例子如下:
Path currentDir = Paths.get("d:\\data\\projects\.\a-project");
复制代码
最终路径为
This path will correspond to the path:
复制代码
..代表父目录或上一级目录。下面是Path的例子:
Path parent = Paths.get("..");
复制代码
这个方法返回的父目录是当前应用程序运行的目录的父目录。
如果..出现在路径字符串的中间,它代表当前字符串的上一级目录,例如:
String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);
复制代码
以上例子指向的绝对路径为
d:\data\projects\another-project
复制代码
a-projcet后面的..会将当前目录指向上一级目录,并将目录向下指向到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()
normalize()方法可以将路径标准化。标准化意味着将路径中的.和..都移除掉,并解析当前路径字符串所指向的路径。下面是Java 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例子首先创建了一个在路径中包含..的路径字符串。然后用这个字符串创建了一个路径,并打印出了路径。
例子中调用了normalize()方法创建了Path实例,它返回了一个新的路径实例。这个新的,标准化的路径实例也被输出了。
下面是以上例子的输出结果:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
复制代码
正如你所看到的,标准化的路径中并不包含==a-project..==。因为它是冗余的。删除的部分不会在最终的绝对路径中添加任何东西。