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

在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何种原因,类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

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

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

相关文章

Windows Mobile 编程 (Win32) - 获取设备能力

《Windows 程序设计》第五章重点讲述图形基础。首先一个示例代码是获取设备描述表信息。代码与Windows Mobile 编程 (Win32) - 输出文本中的代码类似。 #include <windows.h>#define NUMLINES ((int)(sizeof devcaps / sizeof devcaps[0]))struct {int iIndex;TCHAR …

Netty : writeAndFlush的线程安全及并发问题

使用Netty编程时&#xff0c;我们经常会从用户线程&#xff0c;而不是Netty线程池发起write操作&#xff0c;因为我们不能在netty的事件回调中做大量耗时操作。那么问题来了 – 1&#xff0c; writeAndFlush是线程安全的吗&#xff1f; 2&#xff0c; 是否使用了锁&#xff0c;…

[翻译-ASP.NET MVC]Contact Manager开发之旅

本翻译系列为asp.net mvc官方实例教程。在这个系列中&#xff0c;Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试、TDD、Ajax、软件设计原则及设计模式创建一个完整的Contact Manager应用。本系列共七个章节&#xff0c;也是七次迭代过程。本人将陆续对其进行…

数据库 日期格式操作

sql server: 日期转字符串-日期select CONVERT(varchar(100), GETDATE(), 23) from RegionRealtimeData 日期转字符串-全select CONVERT(varchar(100), GETDATE(), 20) from RegionRealtimeData 字符串转日期-日期select CONVERT(date, 2016-02-11, 23) from RegionRealtimeDat…

jsp输出所有请求头的名称

Enumeration headernamesrequest.getHeaderNames();while(headernames.hasMoreElements()){String headernameheadernames.nextElement();out.println(headername "-->" request.getHeader(headername) "");}out.println("");更多专业前端知识…

Spring4:具有Java 8 Date-Time API的@DateTimeFormat

在Spring 3.0中作为Formatter SPI的一部分引入的DateTimeFormat批注可用于解析和打印Web应用程序中的本地化字段值。 在Spring 4.0中&#xff0c; DateTimeFormat批注可以直接与Java 8 Date-Time API&#xff08; java.time &#xff09;一起使用。 在Spring中&#xff0c;可以…

一、rollup

参考&#xff1a;reduxreach-routerrollup-starter-librollup-starter-approller-clicreate-react-library 一、安装 npm install --global rollup二、命令&#xff1a; rollup -c 默认指向rollup.config.jsimport babel from rollup-plugin-babel; import commonjs from ro…

从一本书看经济危机中创业者的机会

最近抽时间在看一本书《赢道&#xff1a;成功创业者的28条戒律》&#xff0c;赢道营销总裁邓超明、中国企业家联合会秘书长刘洋和资深IT经理人代腾飞三位创业者联手所写。就如同网上所介绍的&#xff0c;这本书分析了近30年来国内外100位风云人物创业成败之道&#xff0c;讲述了…

JSF中run项目时候Tomcat8启动不了的一种方法

把另一个博客内容迁移到这 我的问题是Tomcat是可以启动的 但是run那个jsp的时候七月 10, 2016 3:14:54 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property source to org.eclipse…

elasticsearch_dsl.exceptions.ValidationException: You cannot write to a wildcard index.

elasticsearch_dsl.exceptions.ValidationException: You cannot write to a wildcard index. 这里是因为版本不匹配的问题 查看es版本方法如下&#xff1a; 查看elasticsearch包与elasticsearch-dsl版本方法&#xff08;pip list&#xff09;如下&#xff1a; 因为我的es是5.1…

ListView执行notifyDatasetChanged无数据显示,getView未执行

自定义的一个ListView放到布局文件中&#xff0c;设置widthmatch_parent&#xff0c;heightwrap_content。 设置数据后执行notifyDatasetChanged。可以确定数据发生了变化&#xff0c;但是没有进入到getView中刷新数据。 经过尝试&#xff0c;设置height为match_parent之后数据…

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

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

【转】解析.Net框架下的XML编程技术

【引自突破思维的禁忌的博客】一、前言 XML是微软.Net战略的一个重要组成部分&#xff0c;而且它可谓是XML Web服务的基石&#xff0c;所以掌握.Net框架下的XML技术自然显得非常重要了。本文将指导大家如何运用C#语言完成.Net框架下的XML文档的读写操作。首先&#xff0c;我会向…

line-height 属性

p.small {line-height:90%} p.big {line-height:200%} 该属性会影响行框的布局。在应用到一个块级元素时&#xff0c;它定义了该元素中基线之间的最小距离而不是最大距离。 line-height 与 font-size 的计算值之差&#xff08;在 CSS 中成为“行间距”&#xff09;分为两半&…

wstngfw中使用Viscosity连接OpenV-P-N服务器

wstngfw中使用Viscosity连接OpenV-P-N服务器 在本例中&#xff0c;将假设以下设置&#xff1a; 站点 A站点 B名称Beijing Office&#xff08;北京办公室&#xff09;名称Shenzheng Office&#xff08;深圳办公室&#xff09;WAN IP192.168.10.46WAN IP192.168.20.46LAN 子网192…

软件开发薪资调查

软件开发薪资调查 以下是根据朋友和自己面试过的几家公司的了解得到的结果&#xff0c;可能与实际数据有些出入&#xff0c;只做参考。 2&#xff5e;3年工作经验的&#xff1a;杭州 公司名 公司性质 待遇 灵川 欧美&#xff08;英国…

使用jXLS将Excel文件解析为JavaBeans

这篇文章展示了如何使用jXLS将Excel文件解析为JavaBeans列表。 这是我编写的通用实用程序方法&#xff1a; /** * Parses an excel file into a list of beans. * * param <T> the type of the bean * param xlsFile the excel data file to parse * param jxlsConfigF…

开张了!

今天开张了&#xff0c;试试看&#xff01; Code1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Model 6{ 7 public enum SiteType 8 { System,External,All}; 9 [Serializable]10 class SiteInfo11 {12 public i…

实时监听input输入框value的变化:

HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件实时监听输入框value的变化 oninput 事件在用户输入时触发。 该事件在 <input> 或 <textarea> 元素的值发生改变时触发。 提示&#xff1a; 该事件类似于 onchange 事件。不同之处在于 oninput 事件…

dubbo和zookeeper的关系

转载前言&#xff1a;网络上很多教程没有描述zookeeper和dubbo到底是什么关系、分别扮演了什么角色等信息&#xff0c;都是说一些似是而非的话&#xff0c;这里终于找到一篇文章&#xff0c;比较生动地描述了注册中心和微服务框架之间的关系&#xff0c;以及他们之间的合作分工…