Java NIO路径

时间:2020-01-09 10:36:16  来源:igfitidea点击:

JavaPath接口是Java NIO 2更新的一部分,Java NIO在Java 6和Java 7中收到了该接口。JavaPath接口已添加到Java 7中的Java NIO。 java.nio.file包,因此JavaPath接口的标准名称是java.nio.file.Path

JavaPath实例代表文件系统中的路径。路径可以指向文件或者目录。路径可以是绝对路径,也可以是相对路径。绝对路径包含从文件系统根目录到其指向的文件或者目录的完整路径。相对路径包含相对于其他路径的文件或者目录路径。相对路径可能听起来有些混乱。不用担心我将在本Java NIO Path教程的后面详细解释相对路径。

在某些操作系统中,请勿将文件系统路径与" path"环境变量混淆。 java.nio.file.Path接口与path环境变量无关。

在许多方面,java.nio.file.Path接口类似于java.io.File类,但是有一些细微的差别。不过,在许多情况下,我们可以使用Path接口来代替File类的使用。

创建路径实例

为了使用java.nio.file.Path实例,我们必须创建Path实例。我们可以在名为Paths.get()的Paths类(java.nio.file.Paths)中使用静态方法创建一个Path实例。这是一个JavaPaths.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")方法调用。它是对创建Path实例的Paths.get()方法的调用。换句话说,Paths.get()方法是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/HymanHyman/myfile.txt");

绝对路径现在是/ home / HymanHyman / myfile.txt

如果我们在Windows机器上使用了这种路径(以/开头的路径),则该路径将被解释为相对于当前驱动器。例如,路径

/home/HymanHyman/myfile.txt

可以解释为位于C驱动器上。然后该路径将对应于此完整路径:

C:/home/HymanHyman/myfile.txt

创建相对路径

相对路径是从一个路径(基本路径)指向目录或者文件的路径。相对路径的完整路径(绝对路径)是通过将基本路径与相对路径组合而得出的。

Java NIOPath类也可以用于处理相对路径。我们可以使用Paths.get(basePath,relativePath)方法创建一个相对路径。这是Java中的两个相对路径示例:

Path projects = Paths.get("d:\data", "projects");

Path file     = Paths.get("d:\data", "projects\a-project\myfile.txt");

第一个示例创建一个JavaPath实例,该实例指向路径(目录)d:\ data \ projects。第二个示例创建一个Path实例,该实例指向路径(文件)d:\ data \ projects \ a-project \ myfile.txt

使用相对路径时,可以在路径字符串中使用两个特殊代码。这些代码是:

  • ..

代码"。"的意思是"当前目录"。例如,如果我们创建这样的相对路径:

Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());

然后,JavaPath实例所对应的绝对路径将是执行上述代码的应用程序所在的目录。

如果在路径字符串的中间使用.,则表示该路径指向的目录与该目录相同。这是一个"路径"示例,说明了这一点:

Path currentDir = Paths.get("d:\data\projects\.\a-project");

此路径将对应于以下路径:

d:\data\projects\a-project

" .."代码表示"父目录"或者"上一个目录"。这是一个PathJava示例,说明了这一点:

Path parentDir = Paths.get("..");

此示例创建的Path实例将与运行该代码的应用程序从其启动目录的父目录相对应。

如果在路径字符串的中间使用" .."代码,它将对应于在该路径字符串的该位置上更改一个目录。例如:

String path = "d:\data\projects\a-project\..\another-project";
Path parentDir2 = Paths.get(path);

此示例创建的JavaPath实例将对应以下绝对路径:

d:\data\projects\another-project

a-project目录之后的代码将父目录projects更改为目录,然后路径从那里向下引用至other-project目录。

...代码也可以与两字符串的Paths.get()方法结合使用。这是两个JavaPaths.get()示例,显示了它们的简单示例:

Path path1 = Paths.get("d:\data\projects", ".\a-project");

Path path2 = Paths.get("d:\data\projects\a-project",
                       "..\another-project");

Java NIOPath类可以使用更多方式来处理相对路径。我们将在本教程的后面部分了解有关此内容的更多信息。

Path.normalize()

Path接口的normalize()方法可以规范路径。规范化意味着它将删除路径字符串中间的所有...代码,并解析路径字符串引用的路径。这是一个JavaPath.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"实例(实际上它会打印" Path.toString()")。

然后该示例在创建的Path实例上调用normalize(),该实例返回一个新的Path实例。然后,还会打印出这个新的,标准化的" Path"实例。

这是上面示例打印的输出:

path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project

如我们所见,规范化路径不包含a-project \ ..部分,因为这是多余的。删除的部分不会为最终的绝对路径添加任何内容。