介绍

Java的最后几个发行版本,即Java 7,Java 8和即将到来的Java 9,具有许多功能,这些功能使Java开发人员的生活更加轻松。 (我知道Java 9会使它变得更困难,但是只有在您采用新的范例时才可以。之后,它将变得更好)。

功能或API之一是Java 7中引入的File API的增强。该功能集的新类之一是java.nio.file.Path及其工厂java.nio.file.Paths

Maven依赖

我们将使用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创建者就是它提供了两个工厂方法:

  • 静态路径get(字符串优先,字符串…更多)
  • 静态路径get(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

使用

此方法用于检查给定的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的名称部分是log。

@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.pathPath实例上调用getParent()返回代表/ var / log / myappPath实例

如果给定路径没有父路径或它是根目录,则返回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返回如果它存在的根或空的路径的给定实例的路径实例。

@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有点棘手。 它将删除路径中的多余元素。 冗余元素是那些元素的删除最终将导致相似的Path的元素。 例如:如果我们有路径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");
}

使用

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

@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。

翻译自: https://www.javacodegeeks.com/2017/08/getting-know-java-nio-file-path-1.html

了解java.nio.file.Path – 1相关推荐

  1. 了解java.nio.file.Path – 2

    在本文的第1部分中,我们研究了java.nio.file.Path类中的大多数API. 在本文中,我们将介绍其余的API. 使用register() 该API允许我们注册java.nio.file.W ...

  2. java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...

    我想使用Robolectric进行单元测试,但是我正在尝试使用robolectric进行简单测试,因此一开始我很困惑. 我遵循了手册,对示例进行了同样的操作,甚至其他帖子也无济于事. 每次收到错误消息 ...

  3. Java文件– java.nio.file.Files类

    Java Files class was introduced in Java 1.7 and is a part of java.nio.file package. Java Files类是Java ...

  4. java.nio.file.FileSystemException: xxx: Too many open files

    前言 linux Redhat 7.0 spring boot 2.0.x jdk1.8 长时间运行程序后,出现java.nio.file.FileSystemException: xxx: Too ...

  5. okHttp使用中报Could not find method java.nio.file.Files.newOutputStreamo警告问题

    最近在使用okHttp过程中总是报下面的警告 I/dalvikvm﹕ Could not find method com.squareup.okhttp.internal.huc.HttpURLCon ...

  6. Unable to make field private final java.lang.String java.io.File.path accessible: module java.base d

    Android Studio编译报错: Unable to make field private final java.lang.String java.io.File.path accessible ...

  7. 【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )

    文章目录 一. 报错信息 二. 解决方案 一. 报错信息 Flutter 混合开发项目 : 在 Android 项目中 , 嵌入了 Flutter 页面 , 不小心运行了下 Flutter 项目 , ...

  8. Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg

    由于一次电脑蓝屏,Idea启动tomcat报错: Error:Artifact ':war exploded': java.nio.file.InvalidPathException: Illegal ...

  9. SonarQube启动报错:WrapperSimpleApp: Encountered an error running main: java.nio.file.AccessDeniedExcepti

    SonarQube启动报错 可以查看日志,一般日志会记录错误的详细内容 执行以下命令,查看日志: cd /opt/sonarqube-6.7.6/logs tail -n 100 sonar.log ...

最新文章

  1. 天问电子少年团DIY作品
  2. 手把手教你实现SVM算法(二)
  3. pip安装的库导入pycharm中
  4. Android之Android Studio--Gradle多渠道打包
  5. SpringBoot集成flowable-modeler(6.4.1) 实现免登
  6. ArrayList和数组之间的一些转换
  7. python登录交换机执行命令_利用Python脚本登录交换机实现自动配置备份的方法
  8. thinkphp5 return 返回空_杨丞琳演唱会意外踩空,从两层楼高的舞台掉落,李荣浩心疼发文...
  9. java中的scanner用法
  10. oracle ebs fa_category_books,FA有用的脚本 - Oracle EBS R12 - ITPUB论坛-中国专业的IT技术社区...
  11. 虚拟化之Proxmox VE虚拟机创建及模板制作
  12. 使用高德地图自定义marker、infowindow
  13. UE4(Unreal Engine4)快捷键
  14. 声学模型(语音识别中的)--学习笔记
  15. MEMS mic之PDM mic(二)
  16. 奇异值分解的物理意义
  17. HTM页面监听Crtl + C 事件
  18. BAT 字符串大小写转换
  19. -bash: mysql: command not found 解决办法
  20. 如何防止跨站点脚本攻击

热门文章

  1. 超详细的 Redis Cluster 官方集群搭建指南
  2. mybatis入门(一)之基础安装
  3. vue2.0 $router和$route的区别
  4. 阿里巴巴对Java编程【集合处理】的规约
  5. C#中的序列化和反序列化案例
  6. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
  7. php curl post 超时设置,在PHP中设置curl的超时参数(timeout)
  8. java线程的创建线程_多线程(Thread、线程创建、线程池)
  9. 从oracle里面取直,45个非常有用的 Oracle 查询语句小结
  10. java this用法_java中this用法小结