Java Nio 简明教程

Java NIO - Path

顾名思义,路经是文件系统中诸如文件或目录之类的实体所在特定位置,以便人们可以在该特定位置搜索和访问它。

从技术上讲,在 Java 的术语中,路经是一个在 Java 7 版本中引入到 Java NIO 文件包中的接口,并且是特定文件系统中位置的表示。由于路经接口在 Java NIO 包中,因此它的限定名称为 java.nio.file.Path。

一般来说,实体的路经可以是两種類型,一种是绝对路徑,另一種是相对路徑。正如两种路徑的名称所示,绝对路徑是从根目錄到該实体所在位置的位置地址,而相對路徑是相对于其他一些路徑的位置地址。Path在其定义中使用分隔符,在 Windows 中使用“\”,而在 UNIX 操作系统中使用“/”。

为了获取 Path 的实例,可以使用 java.nio.file.Paths 类` get() `的静态方法。此方法将路经字符串或一串连接后形成路经字符串的字符串转换为 Path 实例。如果传递的参数包含非法字符,此方法还会抛出运行时 InvalidPathException。

如上所述,可以通过传递根元素和查找文件所需的完整目录列表来检索绝对路径。而可以通过将基路径与相对路径结合来检索相对路径。将在以下示例中说明如何检索这两个路径

Example

package com.java.nio;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.file.FileSystem;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
   public static void main(String[] args) throws IOException {
      Path relative = Paths.get("file2.txt");
      System.out.println("Relative path: " + relative);
      Path absolute = relative.toAbsolutePath();
      System.out.println("Absolute path: " + absolute);
   }
}

到目前为止,我们知道什么是路径接口,为什么我们需要它以及如何访问它。现在,我们会了解到路径接口为我们提供哪些重要的方法。

Important methods of Path Interface

  1. getFileName() − 返回创建此对象的的文件系统。

  2. getName() − 将此路径的一个名称元素作为 Path 对象返回。

  3. getNameCount() − 返回路径中的名称元素数。

  4. subpath() − 为此路径的名称元素的子序列返回相对路径。

  5. getParent() − 返回父路径,如果没有父路径,则返回一个 null。

  6. getRoot() − 将此路径的根组件作为 Path 对象返回,如果没有根组件,则返回一个 null。

  7. toAbsolutePath() − 返回表示此路径的绝对路径的 Path 对象。

  8. toRealPath() − 返回现有文件的真实路径。

  9. toFile() − 返回表示此路径的文件对象。

  10. normalize() − 返回此路径,其中已消除冗余的名称元素。

  11. compareTo(Path other) − 词汇比较两个抽象路径。如果参数等于此路径,则此方法返回零;如果此路径在词汇上小于参数,则返回小于零的值;如果此路径在词汇上大于参数,则返回大于零的值。

  12. endsWith(Path other) − 测试此路径是否以给定路径结束。如果给定路径有 N 个元素,没有根组件,并且此路径有 N 个或更多元素,则如果每个路径的最后 N 个元素(从最远离根的元素开始)相等,则此路径以给定路径结束。

  13. endsWith(String other) − 测试此路径是否以通过转换给定的路径字符串按 endsWith(Path) 方法指定的方式,而构造的路径结束。

Example

以下示例说明了上面提到的 Path 接口的不同方法 −

package com.java.nio;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.file.FileSystem;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
   public static void main(String[] args) throws IOException {
      Path path = Paths.get("D:/workspace/ContentW/Saurav_CV.docx");
      FileSystem fs =  path.getFileSystem();
      System.out.println(fs.toString());
      System.out.println(path.isAbsolute());
      System.out.println(path.getFileName());
      System.out.println(path.toAbsolutePath().toString());
      System.out.println(path.getRoot());
      System.out.println(path.getParent());
      System.out.println(path.getNameCount());
      System.out.println(path.getName(0));
      System.out.println(path.subpath(0, 2));
      System.out.println(path.toString());
      System.out.println(path.getNameCount());
      Path realPath = path.toRealPath(LinkOption.NOFOLLOW_LINKS);
      System.out.println(realPath.toString());
      String originalPath = "d:\\data\\projects\\a-project\\..\\another-project";
      Path path1 = Paths.get(originalPath);
      Path path2 = path1.normalize();
      System.out.println("path2 = " + path2);
   }
}