Path 接口是 Java NIO 2 在 Java 6 和 Java 7 中升级更新的一部分,是在 Java 7 中新增的接口。该接口位于 java.nio.file 包下面,所以完整的严格命名为:java.nio.file.Path。
Path 接口的实例代表一个文件系统路径,一个路径可以指向文件或者目录,可以是绝对的,也可以是相对的。绝对路径包含从文件系统根目录到其指向的文件或目录的完整路径。相对路径包含相对于其他路径的文件或目录的路径。 相对路径可能听起来有点混乱。 别担心。 我将在本教程的后面更详细地解释相对路径。
不要将文件系统路径和操作系统中的环境变量搞混淆,文件系统路径和环境变量没有任何关系。
在许多方面 java.nio.file.Path 接口与 java.io.File 类是很相似的。但是存在一些细微差别。在许多情况下 ,二者是可以互换的。
创建一个 Path 实例(Creating a Path Instance)
使用 java.nio.file.Path 接口之前必须先创建一个 Path 实例,通过 java.nio.file.Paths 类中的一个叫做 Paths.get() 的静态方法来实现,下面是一个例子:1
2
3
4
5
6
7
8
9
10
11import java.nio.file.Path;
import java.nio.file.Paths;
public class{
public static void main(String[] args){
Path path = Paths.get("c:\data\myfile.txt");
}
}
首先注意样例代码顶部的 import 声明,使用 Path 接口和 Paths 类之前必须先引入它们。
其次注意样例代码 Paths.get("c:\data\myfile.txt") 方法,该方法会创建一个 Path 实例,也就是说 Paths.get() 方法是创建 Path 实例的工厂方法。
创建绝对路径(Creating an Absolute Path)
创建绝对路径只需要通过调用 Paths.get() 工厂方法然后传入绝对文件地址作为参数即可,下面是一个例子:1Path path = Paths.get("c:\data\myfile.txt");
绝对路径是 c: data myfile.txt。 在 Java 字符串中必须使用 \字符,因为是转义字符,表示后面跟的字符在字符串中的真实含义 , \ 代表的是。
上面的路径是 Windows 中的文件系统路径,在 Unix 系统中(Linux, MacOS, FreeBSD 等)中绝对路径是这样子的:1Path path = Paths.get("/home/jakobjenkov/myfile.txt");
绝对路径地址是 /home/jakobjenkov/myfile.txt 。
如果你在 Windows 电脑上使用这种路径,那么会被认为是相对于当前磁盘的一个路径,例如有如下路径:1/home/jakobjenkov/myfile.txt
会被解释为相对于 C 盘的路径,那么完整路径为:1C:/home/jakobjenkov/myfile.txt
新建相对路径(Creating a Relative Path)
相对路径是指从一个路径(基本路径)指向目录或文件的路径。相对路径的完整路径是基本路径与相对路径组合而来的。
Path 类同样适用于相对路径。通过 Paths.get(basePath, relativePath) 方法获取相对路径。下面有两个获取相对路径的例子:1
2
3Path projects = Paths.get("d:\data", "projects");
Path file = Paths.get("d:\data", "projects\a-project\myfile.txt");
第一个例子创建了一个指向 d:dataprojects 目录的实例。第二个例子创建了一个指向 d:dataprojectsa-projectmyfile.txt 文件的实例。
使用相对路径时,可以在路径字符串中使用两个特殊符号。他们是:.
..
. 代表当前目录。例如,如果你创建一个如下的相对路径:1
2Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
然后,Path 实例对应的绝对路径就是是执行当前代码所处的应用程序所在的目录。
如果在路径中间使用了 .,那么它的含义实际上就是目录位置自身,例如:1Path currentDir = Paths.get("d:\data\projects.a-project");
路径会被解释为:1d:dataprojectsa-project
.. 表示父级目录,也就是上一级目录。下面是一个例子:1Path parentDir = Paths.get("..");
样例中的 Path 实例对应到该启动这段代码的应用程序的目录的父目录。
如果你在路径中间使用了 ..,则它会将路径中对应的的位置更改为目录。例如:1
2String path = "d:\data\projects\a-project\..\another-project";
Path parentDir2 = Paths.get(path);
样例代码创建的 Path 实例的绝对路径为:1d:dataprojectsanother-project
a-project 目录之后的 .. 将目录更改为父级目录,然后路径从这里直接指向 another-project 目录。
. 和 .. 可以在两个 Paths.get() 方法中结合使用。这里有两个简单的例子:1
2
3
4Path path1 = Paths.get("d:\data\projects", ".\a-project");
Path path2 = Paths.get("d:\data\projects\a-project",
"..\another-project");
Path 类可以通过多种方式用于处理相对路径。 你将在本教程后面了解更多相关信息。
Path.normalize()
normalize() 方法可以使路径规范化,规范化意味着去掉路径中间的 . 和 .. 代码,然后解析字符串表示的路径。这里有个 normalize() 的例子:1
2
3
4
5
6
7
8String 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 实例打印出来。
以上示例的打印结果如下:1
2path1 = d:dataprojectsa-project..another-project
path2 = d:dataprojectsanother-project
如你所见,规范化之后的路径不包括 a-project.. 部分。因为他是多余的。删除的部分不会为最终的绝对路径添加任何内容。