nio2和nio2

在Java 7发行之前,列出目录内容的领域并没有发生太多事情。但是,由于NIO.2引入了一种新的方法来做到这一点,因此覆盖这一领域可能是值得的。 NIO.2的一大优点是能够在一个方法调用中立即使用列表和过滤。 这为与文件系统相关的大多数列表/筛选需求提供了一种优雅的解决方案。

列出根目录

除非我们使用相对路径,否则我们需要了解应用程序所处的环境,因此我们可以定义绝对路径。 由于文件系统通常是分层结构,因此至少有一个根目录。 为了正确处理文件和目录,我们需要能够列出所有这些根目录。 为此,我们转向FileSystem实例本身以使用其方法getRootDirectories ,它是Java 6构造File.listRoots()的替代方法。

Iterable<Path> it = FileSystems.getDefault().getRootDirectories();System.out.println("Root file system locations: " + Sets.newHashSet(it));

*请注意, Sets类不是JDK的一部分,而是来自Google的Guava库。 我在这里使用它只是为了方便获得根目录的格式正确的字符串表示形式。

具有以下输出:

Root file system locations: C:\, D:\, E:\, F:\, G:\, H:\, I:\,

列出和过滤目录内容

使用文件系统时,标准任务是列出或过滤给定目录中的文件。 我们可能需要修改,分析或简单列出它们-不管什么原因,类java.nio.file.Files都有我们的支持。 它提供了newDirectoryStream方法的三种变体,它们返回DirectoryStream<Path>类型的对象,以允许我们遍历目录中的条目。 在这里,我们看到了防止NullPointerException的IO库的当前版本与先前版本(返回简单数组)之间的明显差异。 以下示例说明了列出给定目录内容的简单程度:

Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");if (Files.isDirectory(directoryPath)) {try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath)) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);}
}

请注意,使用isDirectory检查方法可防止NotDirectoryException 。 还要注意try-with-resources构造的使用– DirectoryStreamAutoCloseableCloseable (这意味着它需要在某个时间关闭),因此try-with-resources派上了用场。 代码返回以下输出:

...
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\CopyOption.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryIteratorException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryNotEmptyException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryStream.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\Files.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileStore.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystem.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemAlreadyExistsException.java
...

为了确保DirectoryStream<Path>通用可用性,我们可以使用两种基本机制进行过滤:

  • newDirectoryStream(Path dir, String glob)

    • 使用GLOB过滤
  • newDirectoryStream (Path dir, DirectoryStream.Filterfilter)
    • 使用DirectoryStream.Filter过滤

使用GLOB模式过滤

首先,我们需要知道GLOB是什么。 GLOB模式是遵循特定语法规则的字符串表达式,它们用于匹配目的。 请参阅以下文章,以获取有关GLOB和GLOB语法的更多信息。 在使用GLOB进行过滤时, Files类为我们提供了一种简便的方法。 让我们看下面的例子。

Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");if (Files.isDirectory(directoryPath)) {try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, "File*Exception*")) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);}
}

具有以下输出:

C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemLoopException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemNotFoundException.java

使用DirectoryStream.Filter进行过滤

当手头的任务需要更复杂的过滤选项而不仅仅是简单的文件名匹配时,我们需要实现DirectoryStream.Filter<Path>接口。 这是我们可以使用的最强大的筛选选项,因为我们可以访问应用程序的其余部分,并且可能使用第三方库。 下面的示例使用两种过滤条件显示了这种情况:

  • 文件大小必须为偶数
  • 执行时间(以毫秒为单位)必须为偶数
Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");
DirectoryStream.Filter<Path> filter = new Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {long size = Files.readAttributes(entry, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS).size();long milis = new Date().getTime();boolean isSizeEvenNumber = size % 2 == 0;boolean isTheTimeRight = milis % 2 == 0;return isTheTimeRight && isSizeEvenNumber;}
};if (Files.isDirectory(directoryPath)) {try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, filter)) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);}
}

具有以下输出:

C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryStream.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\Files.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\NotDirectoryException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\NotLinkException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\package-info.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\WatchEvent.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\WatchService.java

*请注意,根据使用条件,每次执行过滤后的文件可能会有所不同。

翻译自: https://www.javacodegeeks.com/2014/06/listing-and-filtering-directory-contents-in-nio-2.html

nio2和nio2

nio2和nio2_列出和过滤NIO.2中的目录内容相关推荐

  1. 列出和过滤NIO.2中的目录内容

    在Java 7发行之前,列出目录内容的领域并没有发生太多的事情.但是,由于NIO.2引入了一种新的方式来做到这一点,因此涵盖这一领域可能是值得的. NIO.2的一大优点是能够在一个方法调用中立即使用列 ...

  2. linux 家目录没有ssh文件夹,ssh – 如何远程列出已配置用户主目录中的目录

    我注意到当通过ssh对 Linux服务器进行单行处理时,〜的值仍然是本地用户主目录的值,而不是远程用户的主目录.见证本地用户dotancohen和远程用户atwood: $whoami dotanco ...

  3. nio 读取目录所有文件_在NIO.2中使用文件和目录

    nio 读取目录所有文件 在先前的文章中,我讨论了文件和目录的创建( 创建文件和目录 )以及选择( 列出和过滤目录内容 ). 采取的最后一个合乎逻辑的步骤是探索我们如何使用它们以及如何使用它们. 这是 ...

  4. 在NIO.2中使用文件和目录

    在先前的文章中,我讨论了文件和目录的创建( 创建文件和目录 )以及选择( 列出和过滤目录内容 ). 采取的最后一个合乎逻辑的步骤是探索我们如何使用它们以及如何使用它们. 这是库的一部分,它经过了重新设 ...

  5. JavaIO流_下(NIO.2中Path、Paths、Files类的使用)

    NIO.2中Path.Paths.Files类的使用 Java NIO 概述 ​ Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO AP ...

  6. NIO.2中Path、 Paths、Files类的使用

    NIO.2中Path.Paths.Files类的使用 1.NIO概述 2.NIO. 2 3.Path 接口 4.Files 类 package com.atguigu.java;import org. ...

  7. 9.JAVA之GUI编程列出指定目录内容

    代码如下: /*列出指定目录内容*/ import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ...

  8. 过滤XML数据中的非主流特殊字符

    过滤XML数据中的非主流特殊字符 根据W3C的标准,以下16进制的字符是不被允许出现在XML文件中的,即使放在<![CDATA[]]> 中,也不能幸免. \\x00-\\x08 \\x0b ...

  9. Linux 命令之 tree -- 以树状图列出目录的内容/查看目录内容

    文章目录 一.命令介绍 二.常用选项 三.命令示例 (一)按树形结构显示当前目录下的内容 (二)按树状图显示当前目录下的所有目录名称而非文件 (三)列出指定目录下的第一层级的文件和目录名称 (四)不显 ...

最新文章

  1. js 判断js,css是否引入,确保不重复引入
  2. 自动驾驶之路已走了多远?一文读懂研究现状
  3. java01背包问题算法_经典动态规划--01背包问题
  4. Memcached原理深度分析详解
  5. 怎么在坐标上面找outliner的异常检测方法,非监督学习
  6. Linux——vim程序编辑器
  7. SparkSql官方文档中文翻译(java版本)
  8. 计算机应用基础 辅助教学系统,计算机应用基础课程辅助教学及智能测评系统使用手册——网络版.docx...
  9. 一个企业老板给毕业生的十七句话
  10. 基于openoffice+pdfobject.js实现文档上传以及在线预览功能
  11. 局域网访问虚拟机里的应用,以可道云 kod为例
  12. 边境的悍匪—机器学习实战:第一章 机器学习的基础知识
  13. 微信公众号页面中监听手机“返回”,并回到公众号里
  14. 最难得的素养,是等人把话说完
  15. 数仓分层的意义及通用设计
  16. Python中的repr()函数与 ‘!r‘的作用
  17. 如果生活欺骗了你(普希金)
  18. 优盘安装OpenThos操作系统OTO
  19. STM32——SPI驱动SD卡
  20. 西南大学计算机应用基础试题及答案2019,2019年12月网络教育统考《计算机应用基础》单选题61...

热门文章

  1. 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
  2. 2021牛客暑期多校训练营8 J-Tree(思维dp+rmq)
  3. ACL Beginner Contest 总结——F多项式待补
  4. 【bfs】WJ的逃离
  5. 动态规划训练8 [E - Multiplication Puzzle POJ1651]
  6. Spring @Required 注释
  7. Java IO: PipedOutputStream
  8. 程序员如何面对 HR 面试的 40 个问题
  9. Java中的subList方法
  10. 《白鹿原》金句摘抄(七)