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。

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

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\..部分,因为这是多余的。删除的字符串部分不会向最终绝对路径添加任何内容。

英文原文链接:http://tutorials.jenkov.com/java-nio/path.html

------完------

推荐阅读:

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

Java基础知识面试题篇(2020年2月最新版)

更技术学习请进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资源:
https://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-path.html