了解 java.nio.file.Path – 1

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(223)   2024-01-01 07:14:57

介绍

Java 的最后几个版本即 Java 7、Java 8 和即将发布的 Java 9 具有相当多的功能,使 Java 开发人员的工作更加轻松。 (我知道 Java 9 会让它变得更难,但前提是你采用了新的范式。之后它会好得多)。

其中一个特性或 API 是 Java 7 中引入的 File API 的增强。该特性集的一个新类是 java.nio.file.Path 和它的工厂 java.nio.file.Paths

Maven 依赖项

我们将使用 JUnitAssertJ 编写我们的测试来演示 API。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <!-- use 2.8.0 for Java 7 projects -->
    <version>3.8.0</version>
    <scope>test</scope>
</dependency>

创建 java.nio.file.Path 实例

正如我之前提到的,java.nio.file.Pathsjava.nio.file.Path 的创建者,它提供了两个工厂方法:

  • static Path get(String first, String … more)
  • 静态路径获取(URI uri

可用于获取 java.nio.file.Path 的实例。让我们看看获取实例的两种方式:

@Test
public void testPathCreation(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.isAbsolute()).isFalse();
    assertThat(path.toString()).isEqualTo("src\\main\\resources");

    Path uriPath = Paths.get(URI.create("file:///Users/Mohamed/git"));
    assertThat(uriPath.isAbsolute()).isFalse();
    assertThat(uriPath.toAbsolutePath().toString())
            .isEqualTo("C:\\Users\\Mohamed\\git");
}

探索 API

使用 endsWith()

此方法用于检查给定的 Path 对象是否以另一个 Path 对象或表示为 String 对象的路径结尾。

@Test
public void testEndsWith(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.endsWith(Paths.get("main","resources"))).isTrue();
    assertThat(path.endsWith("resources")).isTrue();
}

使用 getFileName()

此方法返回存在于终端或路径末尾的目录或文件的名称。

@Test
public void testGetFileName(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.getFileName().toString()).isEqualTo("resources");
    path = Paths.get("src", "test", "java", "info", 
        "sanaulla","PathDemoTest.java");
    assertThat(path.getFileName().toString())
        .isEqualTo("PathDemoTest.java");
}

使用 getFileSystem()

此方法返回代表底层文件系统的 java.nio.file.FileSystem 实例。我们将在以后的帖子中详细介绍这一点。

@Test
public void testGetFileSystem(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.getFileSystem()).isNotNull();
    assertThat(path.getFileSystem().getSeparator()).isEqualTo("\\");
    path.getFileSystem().getRootDirectories().forEach(System.out::println);
}

使用 getName()getNameCount()

getNameCount() 返回路径中存在的名称组件的数量,其中每个名称组件由文件分隔符分隔。 getName() 方法采用索引并返回索引处的名称组件。

例如给定的路径:/var/log/myapp/spring.log 有 4 个名称组件,组件位置是基于 0 的。所以索引 1 处的名称组件是日志。

@Test
public void testGetName(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.getName(0)).isEqualTo(Paths.get("src"));

    assertThat(path.getName(path.getNameCount() - 1))
            .isEqualTo(Paths.get("resources"));
}

使用 getParent()

此 API 返回从路径根到终端目录或文件(即排除它)的路径。例如:在表示 /var/log/myapp/spring.log 的 Path 实例上调用 getParent() 返回表示 Path 实例>/var/log/myapp

如果给定路径没有父目录或者它是根目录,则返回 null。

@Test
public void testGetParent(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.getParent()).isEqualTo(Paths.get("src", "main"));
    assertThat(Paths.get("/").getParent()).isNull();
}

使用 getRoot()

此 API 返回根的 Path 实例(如果存在)或对于给定的 Path 实例返回 null。

@Test
public void testGetRoot(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.getRoot()).isNull();

    path = Paths.get("/users", "Mohamed", "git", "blogsamples");
    assertThat(path.getRoot()).isEqualTo(Paths.get("/"));
}

使用 normalize()

这个 API 有点棘手。它会删除路径中的冗余元素。冗余元素是那些删除它们最终会导致类似路径 的元素。例如:如果我们有一个路径 src\..\src\main\java 等同于 src\main\javanormalize() API 有助于从前者实现后者。

@Test
public void testNormalize(){
    Path path = Paths.get("src","..", "src", "main", "resources", ".");
    assertThat(path.toString())
            .isEqualTo("src\\..\\src\\main\\resources\\.");
    assertThat(path.normalize().toString())
            .isEqualTo("src\\main\\resources");
}

使用 subpath()

此方法返回由作为参数传递给该方法的下限和上限标识的子路径。计算子路径时排除上限。

@Test
public void testSubpath(){
    Path path = Paths.get("Mohamed", "git", 
            "blogsamples", "src", "main", "resources");
    assertThat(path.subpath(2, 3).toString()).isEqualTo("blogsamples");
    assertThat(path.subpath(0, path.getNameCount()).toString())
            .isEqualTo("Mohamed\\git\\blogsamples\\src\\main\\resources");
}

使用 toAbsolutePath()

此方法返回给定路径的绝对路径。绝对路径源自文件系统的根。

@Test
public void testToAbsolutePath(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.toAbsolutePath().toString())
       .isEqualTo("C:\\Users\\Mohamed\\git\\blogsamples\\src\\main\\resources");
}

使用 toFile()

这是创建 java.io.File 实例的一种非常方便的方法。我们可以利用创建具有多个文件夹级别的 Path 对象,然后使用 toFile() 来获取 File 的实例。

@Test
public void testToFile(){
    Path path = Paths.get("src", "main", "resources");
    File file = path.toFile();
    assertThat(file).isNotNull();
    assertThat(file.isDirectory()).isTrue();
    assertThat(file.exists()).isTrue();
}

使用 toRealPath()

此方法可用于解析指向其实际位置的符号链接。为了测试这个 API,我们创建了一个符号链接:

在 Windows 上你会使用:

mklink /D "C:\blogsample" "C:\Users\Mohamed\git\blogsamples"

在 Linux 上,你会使用

ln -s /var/log/sample.log sample

该方法采用 LinkOption 类型的选项。到目前为止,这个枚举只有一个元素,即 NOFOLLOW_LINKS。如果传递此选项,则符号链接不会解析为其真实路径。

@Test
public void testToRealPath() throws IOException {
    Path path = Paths.get( "/blogsample");
    assertThat(path.toRealPath().toString())
            .isEqualTo("C:\\Users\\Mohamed\\git\\blogsamples");
    assertThat(path.toRealPath(LinkOption.NOFOLLOW_LINKS).toString())
            .isEqualTo("C:\\blogsample");
}

使用 toUri()

此方法返回给定路径的 URI 表示。通常,在 Windows 上,您会看到以下形式的内容:file:///C:/。但这是系统相关的

@Test
public void testToUri(){
    Path path = Paths.get("src", "main", "resources");
    assertThat(path.toUri()).isEqualTo(
      URI.create("file:///C:/Users/Mohamed/git/blogsamples/src/main/resources/"));
}

注意:请务必注意,大多数 API 的返回类型都是 java.nio.file.Path 的实例。这有助于我们链接多个方法并在单个 java.nio.file.Path 实例上调用它们。

在下一篇文章中,我们将查看 java.nio.file.Path 中剩余的几个 API。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-getting-know-java-nio-file-path-1.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...