Java 的最后几个版本即 Java 7、Java 8 和即将发布的 Java 9 具有相当多的功能,使 Java 开发人员的工作更加轻松。 (我知道 Java 9 会让它变得更难,但前提是你采用了新的范式。之后它会好得多)。
其中一个特性或 API 是 Java 7 中引入的 File API 的增强。该特性集的一个新类是 java.nio.file.Path 和它的工厂 java.nio.file.Paths。
我们将使用 JUnit 和 AssertJ 编写我们的测试来演示 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.Paths 是 java.nio.file.Path 的创建者,它提供了两个工厂方法:
可用于获取 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"); }
此方法用于检查给定的 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(); }
此方法返回存在于终端或路径末尾的目录或文件的名称。
@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"); }
此方法返回代表底层文件系统的 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); }
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")); }
此 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(); }
此 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("/")); }
这个 API 有点棘手。它会删除路径中的冗余元素。冗余元素是那些删除它们最终会导致类似路径 的元素。例如:如果我们有一个路径 src\..\src\main\java 等同于 src\main\java。 normalize() 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"); }
此方法返回由作为参数传递给该方法的下限和上限标识的子路径。计算子路径时排除上限。
@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"); }
此方法返回给定路径的绝对路径。绝对路径源自文件系统的根。
@Test public void testToAbsolutePath(){ Path path = Paths.get("src", "main", "resources"); assertThat(path.toAbsolutePath().toString()) .isEqualTo("C:\\Users\\Mohamed\\git\\blogsamples\\src\\main\\resources"); }
这是创建 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(); }
此方法可用于解析指向其实际位置的符号链接。为了测试这个 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"); }
此方法返回给定路径的 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