Java NIO - Path(目录)

  • 简述

    顾名思义,Path是实体(如文件或文件系统中的目录)的特定位置,以便可以在该特定位置搜索和访问它。
    从技术上讲,路径是在Java版本7期间在Java NIO文件包中引入的接口,并且是特定文件系统中位置的表示形式。由于路径接口在 Java NIO 包中,因此它的限定名称为 Java.nio.file.Path。
    通常,实体的路径可以是两种类型,一种是绝对路径,另一种是相对路径。由于两个路径的名称都表明绝对路径是从根到其所在实体的位置地址,而相对路径是相对于其他路径的位置地址。Path 在其定义中使用分隔符,对于 Windows 使用“\”,对于 unix 操作系统使用“/”。
    为了获取路径的实例,我们可以使用静态方法 java.nio.file.Paths get()方法将路径字符串或连接形成路径字符串的字符串序列转换为 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 relative = Paths.get("file2.txt");
          System.out.println("Relative path: " + relative);
          Path absolute = relative.toAbsolutePath();
          System.out.println("Absolute path: " + absolute);
       }
    }
    
    到目前为止,我们知道什么是路径接口,为什么我们需要它,我们如何访问它。现在我们知道Path接口为我们提供了哪些重要方法。
  • 路径接口的重要方法

    • getFileName() − 返回创建此对象的文件系统。
    • getName() − 将此路径的名称元素作为路径对象返回。
    • getNameCount() − 返回路径中名称元素的数目。
    • subpath() − 返回一个相对路径,该路径是此路径的名称元素的子序列。
    • getParent() − 返回父路径,如果此路径没有父路径,则返回空。
    • getRoot() − 将此路径的根组件作为 Path 对象返回,如果此路径没有根组件,则返回 null。
    • toAbsolutePath() − 返回一个表示此路径的绝对路径的路径对象。
    • toRealPath()现有文件的实际路径。
    • toFile() − 返回一个表示此路径的文件对象。
    • normalize() − 返回一个路径,该路径是消除了冗余名称元素的路径。
    • compareTo(Path other) − 按字典顺序比较两个抽象路径。如果参数等于此路径,则此方法返回零,如果此路径在字典上小于参数,则返回小于零的值,如果此路径在字典上大于参数,则返回大于零的值。
    • endsWith(Path other) − 测试此路径是否以给定路径结束。如果给定路径有 N 个元素,但没有根组件,并且此路径有 N 个或更多元素,则当每个路径的最后 N 个元素(从距根最远的元素开始)相等时,此路径以给定路径结束。
    • endsWith(String other) − 测试此路径是否以 Path 结尾,该路径通过转换给定的路径字符串以 endWith(Path) 方法指定的方式构造。
  • 以下示例说明了上面提到的 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);
       }
    }