Path
Java的Path
接口是Java NIO在Java6和Java7两次更新的一部分。Java的Path
接口是在Java7中加入Java NIO的。Path
接口在java.nio.file
包下,所以Path
接口的权限定名是java.nio.file.Path
。
一个Path
实例代表文件系统的一个路径。一个路径可以指向一个文件或一个目录。路径是相对路径或绝对路径。绝对路径包括了从文件系统的根路径到其指向的文件或目录的全路径。相对路径包含了一个文件或目录相对于其他路径的路径。相对路径听起来可能有点混乱。不用担心,我会在本教程中详细介绍相对路径。
不要把文件系统路径和一些操作系统中的path环境变量搞混了。java.nio.file.Path
接口和path环境变量一点关系都没有。
java.nio.file.Path
在许多方面都和java.io.File
很相似,但也有一些细微的差别。在许多情况下,你都可以用Path
来代替File
。
Creating a Path Instance
在使用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
类之前,我们需要先import
它们。
第二,注意Paths.get("c:\\data\\myfile.txt")
这句方法调用。通过Paths.get()
的方法调用,我们创建了一个Path
实例。换句话说,Paths.get()
方法是生产Path
实例的工厂方法。
Creating an Absolute Path
调用Paths.get()
方法时传入一个绝对文件可以创建一个绝对路径。以下创建一个代表绝对路径的Path实例的例子:
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
Creating a Relative 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\projects(目录)的Path
实例。第二个例子创建了一个指向d:\data\projects\a-project\myfile.txt(文件)的Path
实例。
在处理相对路径时,有两个特殊字符你可以在路径字符串中使用。它们是(注意,你没有眼花):
- .
- ..
“.”代表当前目录。比如,如果你像这样创建相对路径:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
那么,这个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);
这个例子创建的Path
实例与下面的路径对应:
d:\data\projects\another-project
a-project之后的“..”让整个路径向上移动到了projects目录,然后从那开始引用到another-project目录。
“.”和“..”也可以在有两个String
参数的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.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.toString()
)。
然后例子调用了创建的Path
实例的normalize()
方法,并返回了一个新的Path
实例。然后这个新的、标准化的Path
实例也被打印了出来。
这是上面的例子打印出来的结果:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
如你所见,标准化的路径没有包含a-project..,因为这是多余的。删除的部分对最终的路径没有任何作用。
发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO。