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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pat 乙级 1033 旧键盘打字(C++)

题目 旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键&#xff0c;打出的结果文字会是怎样&#xff1f; 输入格式&#xff1a; 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文…

修改typora主题的字体

简 述&#xff1a; 在 mac 中修改 typora 主题的英文和中文的字体&#xff0c;使得码字更加舒服&#xff08;win 也有效&#xff09;。 [TOC] 本文初发于 “偕臧的小站“&#xff0c;同步转载于此。 书写环境&#xff1a; &#x1f4bb;&#xff1a; MacOS 10.14.6 &#x1…

在ADF 12.2.1.3中使用基于JSON的REST Web服务

以前&#xff0c;我曾发布过有关在ADF中使用基于ADF BC的REST Web服务的信息。 现在&#xff0c;本文讨论使用通用数据控件使用基于JSON的REST Web服务。 您也可以查看有关Web服务的先前文章&#xff0c;以获取更多信息。 在ADF 12.2.1中使用应用程序模块快速创建SOAP Web服务…

C++中字符型和整型的关系

文章目录结论测试字符与字符字符与数字实用小技巧字符转数字数字转字符ASCII的特点结论 字符型就是整型&#xff0c;对应的整数由ASCII(美国信息交换标准代码)规定。字符和整数&#xff0c;或者字符和字符进行运算时&#xff0c;结果为int。与整型的运算规则完全一样。 测试 …

hibernate 调试_Hibernate调试–查找查询的来源

hibernate 调试Hibernate为何在程序的哪个部分以及在哪个部分中生成给定SQL查询并不总是立即的&#xff0c;尤其是当我们处理的是我们自己编写的代码时。 这篇文章将介绍如何配置Hibernate查询日志记录&#xff0c;并将其与其他技巧一起使用&#xff0c;以找出在程序中执行给定…

Ubuntu终端多窗口分屏Terminator

1、安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator2、快捷键 F11 全屏 CtrlShiftE 垂直分割窗口 CtrlShiftO 水平分割窗口CtrlShiftC 复制 CtrlShiftV 粘贴CtrlTab 在分割的各窗口之间切换 CtrlShiftPageDown 在相邻的两个窗…

专业QA如何实施可靠的CI / CD管道?

过时的传统软件开发方法并不能接管不断升级的市场趋势&#xff0c;并且这些方法缺乏解决方案&#xff0c;这些解决方案无法满足引入“ 持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09; ”的快速软件发布的日益增长的需求。 除CI / CD之外&#xff0c;…

C语言中的宏定义

简单宏定义 简单的宏定义有如下格式&#xff1a; [#define指令&#xff08;简单的宏&#xff09;]  #define 标识符替换列表替换列表是一系列的C语言记号&#xff0c;包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时&…

solr analyzer_查看您的Solr缓存大小:Eclipse Memory Analyzer

solr analyzerSolr使用不同的缓存来防止请求期间过多的IO访问和计算。 如果索引不是很频繁发生&#xff0c;则可以通过使用这些缓存来获得巨大的性能提升。 根据索引数据的结构和缓存的大小&#xff0c;它们可能会变得很大&#xff0c;并占用堆内存的很大一部分。 在本文中&…

好用的电脑软件总结

一 科研 1 阅读软件 Citavi 文献阅读软件小绿鲸SCI 文献翻译软件文献翻译阅读软件 &#xff1a;Quicker沙拉查词 来自 https://mubu.com/doc/vWDgwhwdg0 注&#xff1a;沙拉查词可能出现翻译后仍然保持选中的状态&#xff0c;鼠标无法自由移动&#xff0c;针对这种情况&#…

笔记本启动与关闭自带键盘

Win S打开搜索界面 输入cmd 以管理员权限打开 执行以下命令 如果是关闭键盘 sc config i8042prt start disabled如果是开启键盘 sc config i8042prt startauto对应的注册表位置&#xff1a; [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt] "S…

lucene快速入门_为Lucene选择快速唯一标识符(UUID)

lucene快速入门大多数使用Apache Lucene的搜索应用程序都会为每个索引文档分配一个唯一的ID&#xff08;即主键&#xff09;。 尽管Lucene本身不需要这样做&#xff08;它可能不太在乎&#xff01;&#xff09;&#xff0c;但应用程序通常需要它以后通过其外部ID替换&#xff0…

vim字符串替换

vi/vim 中可以使用 &#x1f612; 命令来替换字符串。以前只会使用一种格式来全文替换&#xff0c;今天发现该命令有很多种写法(vi 真是强大啊&#xff0c;还有很多需要学习)&#xff0c;记录几种在此&#xff0c;方便以后查询。 替换    : s/vivian/sky/ 替换当前行第一个 v…

使用网真和WAD热部署Kubernetes

在Kubernetes环境中测试企业应用程序时&#xff0c;更改&#xff0c;重新打包和重新部署应用程序的周转可能变得非常高。 网真旨在通过将本地运行的进程代理到我们的Kubernetes集群中来减轻这种情况&#xff0c;就像本地进程是集群的一部分一样。 如果我们将这种方法与诸如WAD之…

git clone 项目出现 Failed to connect to github.com port 443: Timed out

将命令号中的https 改为git 就可以解决这个问题的出现

使用eclipse调试ns3-配置说明

Tips&#xff1a; 1&#xff0c; 安装eclipse时注意选择C开发组件&#xff1b; 环境配置参考&#xff1a;https://www.cnblogs.com/zlcxbb/p/3852810.html 第一步&#xff0c;新建C工程&#xff1b; 第二步&#xff0c;在project explorer中右键属性&#xff0c;如下图&#…

singleton 类_在Java中对Singleton类进行双重检查锁定

singleton 类Singleton类在Java开发人员中非常常见&#xff0c;但是它给初级开发人员带来了许多挑战。 他们面临的主要挑战之一是如何使Singleton保持为Singleton&#xff1f; 也就是说&#xff0c;无论出于何种原因&#xff0c;如何防止单个实例的多个实例。 对Singleton进行双…

将 Citavi 笔记按需要导出

文章目录简要介绍导出某一条笔记导出按条件筛选的一类笔记导出某一篇 PDF 的笔记导出全部笔记简要介绍 Citavi 的笔记功能相比其他文献管理软件较为完善&#xff0c;对 PDF 的标注是一种双链标注&#xff0c;阅读论文更方便&#xff0c;这也是当下很多笔记软件在做的功能之一&…