Java Path 接口作为 Java NIO 2 更新的一部分,Java NIO 在 Java 6 和 Java 7 中接收了这一更新。Java Path 接口被添加到了 Java 7 的 Java NIO 中,Path 接口位于 java.nio.file 包下,因此 Java Path 接口的完整名称是 java.nio.file.Path。
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
Java Path 实例表示文件系统中的路径。Path 可以指向文件或目录。Path 可以是绝对路径也可以是相对路径,绝对路径包含了从根目录到该文件或目录的完整路径,相对路径包含该文件或目录相对于其他路径的路径。相对路径听起来可能有点混乱。但是别急,稍后我们会详细介绍。
不要把文件系统中路径和和操作系统中的环境变量路径混淆,java.nio.file.Path 和操作系统环境变量没有任何关系。
在许多方面,java.no.file.Path 接口和 java.io.File 类比较相似,但是他们之间也存在一些细微的区别。不过,在大多数情况下,可以使用 Path 接口来替换 File 类的使用。
创建 Path 实例(Creating a Path Instance)
要使用 java.nio.file.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 类,我们必须首先引入(import)它们。
其次,注意 Paths.get("c:\data\myfile.txt")
方法调用。这个方法会创建一个 Path 实例,换句话说,Paths.get()
是 Path 示例的一个工厂方法。
创建绝对路径(Creating an Absolute Path)
创建绝对路径只需调用 Paths.get()
这个工厂方法,该方法使用绝对文件作为参数。下面是一个创建绝对路径示例的示例:
Path path = Paths.get("c:\\data\\myfile.txt");
对路径是 c:\data\myfile.txt
,在 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 类也可以用于处理相对路径,使用 Path.get(basePath, relativePath)
方法可以创建相对路径。以下是通过 Java 代码创建的两个相对路径示例:
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());
那么 Java Path 实例currentDir
的绝对路径就是当前应用程序代码执行的目录。
如果在路径中间使用了 . ,那么他的含义实际上就是目录位置自身。例如:
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
在 .. 前的 a-project
目录将向上更改为父目录,然后路径从更改后的目录组合 .. 后的目录。
. 和 .. 也可以结合起来使用。下面是使用 . 和 .. 结合起来的示例:
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() 方法可以规范化路径。规范化意味着它会删除字符串编码中所有的 . 和 ..然后转换成等价路径。下面是一个 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.toString()
)。
然后,该示例对创建的路径实例调用 normalize()
方法,该实例将返回一个新的路径实例。这个新的、规范化的路径实例也会被打印出来。
以上示例代码的输出如下:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
如您所见,规范化路径中不包含a-project\..
部分,因为这是多余的。删除的字符串部分不会向最终绝对路径添加任何内容。
------完------
推荐阅读:
Java NIO 简明教程 之 Java NIO 服务端套接字通道(ServerSocketChannel)
Java NIO 简明教程 之 Java NIO 非阻塞式服务器(Non-blocking Server)
Java NIO 简明教程 之 Java NIO 数据报通道(DatagramChannel)
Java NIO 简明教程 之 Java NIO 管道(Pipe)
Java NIO 简明教程 之 Java NIO vs. IO
参考资源:
https://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-path.html