Java NIO Path接口
JavaPath接口是Java NIO 2更新的一部分,Java NIO在Java 6和Java 7中得到了该Path接口。Java接口已添加到Java 7中的Java NIO。该Path接口位于java.nio.file包中,因此Java的全限定名。Path接口是java.nio.file.Path。
JavaPath实例代表文件系统中的路径。路径可以指向文件或目录。路径可以是绝对路径,也可以是相对路径。绝对路径包含从文件系统根目录到其指向的文件或目录的完整路径。相对路径包含相对于其他路径的文件或目录路径。相对路径可能听起来有些混乱。不用担心 我将在本Java NIO Path教程的后面详细解释相对路径。
在某些操作系统中, 请勿将文件系统路径与 path环境变量混淆。该java.nio.file.Path接口与path环境变量无关。
java.nio.file.Path接口 在很多方面都类似于java.io.File 类,但是有一些细微的差别。但是,在许多情况下,您可以File使用Path接口来代替对类的使用。
1 创建路径实例
为了使用java.nio.file.Path实例,您必须创建一个Path实例。您可以Path在名为的Paths类(java.nio.file.Paths)中使用静态方法创建实例Paths.get()。这是一个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")方法调用。它是对Paths.get() 创建Path实例的方法的调用。换句话说,该Paths.get()方法是Path实例的工厂方法 。
1.1 创建绝对路径
通过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/xnip/myfile.txt");
绝对的路径是现在/home/jakobjenkov/myfile.txt。
如果您在Windows计算机上使用了这种路径(以开头/的路径),则该路径将被解释为相对于当前驱动器。例如,路径
/home/xnip/myfile.txt
可以解释为位于C驱动器上。然后该路径将对应于此完整路径:
C:/home/xnip/myfile.txt
1.2 创建相对路径
相对路径是从一个路径(基本路径)指向目录或文件的路径。相对路径的完整路径(绝对路径)是通过将基本路径与相对路径组合而得出的。
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指向路径(file)的实例d:\data\projects\a-project\myfile.txt 。
使用相对路径时,可以在路径字符串中使用两个特殊代码。这些代码是:
- .
- ..
该.代码表示“当前目录”。例如,如果您创建这样的相对路径:
Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());
然后,JavaPath实例对应的绝对路径将是执行上述代码的应用程序所在的目录。
如果在.路径字符串的中间使用,则仅表示与该路径指向的目录相同的目录。这是Path说明此的示例:
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);
本Path示例创建的Java实例将与此绝对路径相对应:
d:\data\projects\another-project
在..后代码a-project目录更改目录了父目录projects,然后路径引用,下入another-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类可用于与相对路径一起使用的更多方法。在本教程的后面,您将学到更多有关它的信息。
2 relativize()方法
Java Path方法relativize()可以创建一个新路径,该路径表示相对于第一个路径的第二个路径。例如,使用/data和/data/subdata/subsubdata/myfile.txt"可以将第二路径表示为/subdata/subsubdata/myfile.txt相对于第一路径。看下面的例子:
Path basePath = Paths.get("/data");
Path path = Paths.get("/data/subdata/subsubdata/myfile.txt");
Path basePathToPath = basePath.relativize(path);
Path pathToBasePath = path.relativize(basePath);
System.out.println(basePathToPath);
System.out.println(pathToBasePath);
从此示例打印的输出将是:
subdata/subsubdata/myfile.txt
../../..
如果将相对路径添加subdata/subsubdata/myfile.txt到目录路径/data,则会获得完整路径/data/subdata/subsubdata/myfile.txt。
如果将相对路径添加../../..到完整文件路径,/data/subdata/subsubdata/myfile.txt 则会得到/data
注意:尝试计算从一个路径到另一路径的相对路径时,不能混合使用相对路径和绝对路径。relativize()方法将失败,并带有异常。因此,这是不允许的:
Path basePath = Paths.get("/data");
Path path = Paths.get("myfile.txt");
Path basePathToPath = basePath.relativize(path);
如果尝试这样做,将出现以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: 'other' is different type of Path
at java.base/sun.nio.fs.WindowsPath.relativize(WindowsPath.java:400)
at java.base/sun.nio.fs.WindowsPath.relativize(WindowsPath.java:42)
at com.jenkov.java.nio.PathExamples.main(PathExamples.java:33)
3 normalize()方法
接口 的normalize()方法Path可以规范化路径。规范化意味着它将删除路径字符串中间的所有.和..代码,并解析路径字符串引用的路径。这是一个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实例(实际上它打印Path.toString())。
然后,该示例调用normalize()创建的Path实例,该实例返回一个新 Path实例。Path然后,该新的规范化实例也会被打印出来。
这是上面示例打印的输出:
path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project
如您所见,归一化路径不包含该a-project\..部分,因为这是多余的。删除的部分不会为最终绝对路径添加任何内容。