Java NIO系列教程(十 五)Java NIO Path

原文链接  译者:章筱虎

Path接口是java NIO2的一部分。首次在java 7中引入。Path接口在java.nio.file包下,所以全称是java.nio.file.Path。 java中的Path表示文件系统的路径。可以指向文件或文件夹。也有相对路径和绝对路径之分。绝对路径表示从文件系统的根路径到文件或是文件夹的路径。相对路径表示从特定路径下访问指定文件或文件夹的路径。相对路径的概念可能有点迷糊。不用担心,我将在本文的后面详细介绍相关细节。

不要将文件系统的path和操作系统的环境变量path搞混淆。java.nio.file.Path接口和操作系统的path环境变量没有任何关系。

在很多方面,java.nio.file.Path接口和java.io.File有相似性,但也有一些细微的差别。在很多情况下,可以用Path来代替File类。

创建Path实例

为了使用java.nio.file.Path实例,必须首先创建它。可以使用Paths 类的静态方法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语句。想要使用Paths类和Path接口,必须首先引入相应包。其次,注意Paths.get(“c:\\data\\myfile.txt”)的用法。其使用了Paths.get方法创建了Path的实例。它是一个工厂方法。

创建绝对路径Path

调用传入绝对路径当做参数的Paths.get()工厂方法,就可以生成绝对路径Path。示例如下:

Path path = Paths.get("c:\\data\\myfile.txt");

示例中的绝对路径是c:\data\myfile.txt。有两个\字符的原因是第一个\是转义字符,表示紧跟着它的字符需要被转义。\\表示需要向字符串中写入一个\字符。

上文示例的path是windows下的路径。在Unix系统(Linux,MacOS,FreeBSD等)中,上文中的path是这样的:

Path path = Paths.get("/home/jakobjenkov/myfile.txt");

/home/jakobjenkov/myfile.txt就称作绝对路径。

如果把以/开头path的格式运行在windows系统中,系统会将其解析为相对路径。例如:

/home/jakobjenkov/myfile.txt

将会被解析为路径是在C盘。对应的绝对路径是:

C:/home/jakobjenkov/myfile.txt

创建相对路径Path

相对路径指从一个已确定的路径开始到某一文件或文件夹的路径。将确定路径和相对路径拼接起来就是相对路径对应的绝对路径地址。

java NIO Path类也能使用相对路径。可以通过Paths.get(basePath, relativePath)创建一个相对路径Path。示例如下:

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

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

第一个例子创建了一个指向d:\data\projects文件夹的实例。第二个例子创建了一个指向 d:\data\projects\a-project\myfile.txt 文件的实例。

当使用相对路径的时候,可以使用如下两种特别的符号。它们是:

  • .
  • ..

.表示当前路径。例如,如果以如下方式创建一个相对路径:

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对应的路径是当前运行程序目录的上级目录。

如果在path中使用..,表示上级目录的含义。例如:

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

对应的绝对路径地址为:

d:\data\projects\another-project

在a-project目录后面的..符号,将指向的目录修改为projects目录,因此,最终path指向another-project目录。

.和..都可以在Paths.get()的双形参方法中使用。示例:

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

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

下面介绍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);

上文示例,首先创建了一个包含..字符的路径地址。之后输出此路径。

之后,调用normalize方法,返回一个新的path对象。输出新对象的路径。

输出结果如下:

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

如你所见,标准化后的路径不再包含 a-project\..部分,因为它是多余的。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(十 五)Java NIO Path

  • Trackback 关闭
  • 评论 (4)
    • wangjunlong
    • 2021/03/01 11:51上午

    看原文,relativize() 分析路径间相对路径的方法缺少了

    • wangjunlong
    • 2021/03/01 3:23下午

    Path 类的 Path relativize(Path other) 方法,会将当前path与参数path间的差异创建为Path对象。就比如,路径 “/data” 和”/data/subdata/subsubdata/myfile.txt”两个路径(path),相对于第一个路径(path),第二个路径(path)就可以表示为:”/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
    ../../..

    根据结果我们可以更清楚了解relativize方法,
    如果我们为basePath(“/data”)添加“subdata/subsubdata/myfile.txt”,就会获取整个路径“/data/subdata/subsubdata/myfile.txt”。
    如果我们为path (“/data/subdata/subsubdata/myfile.txt”)添加“ ../../..”,就会获取路径“/data”。

    注意:relativize() 方法不支持相对路径与绝对路径两种类型路径间的相互比较,一旦将两者相互比较,relativize()方法将报 IllegalArgumentException 异常,因此,不要像下方这样编码:
    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)

    • wangjunlong
    • 2021/03/01 3:24下午

    以上作为 Path relativize(Path other) 方法 部分的补充。

    • 匿名
    • 2021/09/13 6:11下午

    怎么没有13,14

return top