Java 7:使用NIO.2进行文件过滤–第3部分

大家好。 这是使用NIO.2系列进行文件过滤的第3部分。 对于那些尚未阅读第1 部分或第2部分的人 ,这里有个回顾。

NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以执行与java.io相同的操作,以及许多出色的功能,例如:访问文件元数据并查看用于目录更改等。 显然,由于向后兼容,java.io包不会消失,但是我们鼓励为满足新的I / O需求而开始使用NIO.2。 在本文中,我们将看到使用此API过滤目录内容有多么容易。 为此,有3种方法,我们已经在第1 部分和第2 部分中回顾了两种类似的方法,但是现在我们将看到一种更强大的方法。

你需要什么

NetBeans 7+或任何其他支持Java 7的IDE

JDK 7+

在某些应用程序中,过滤目录的内容是一项常见的任务,而NIO.2使其变得非常简单。 接下来将描述我们将要使用的类和接口:

  • java.nio.file.Path :接口,其对象可以表示文件系统中的文件或目录。 就像java.io.File,但是在NIO.2中。 无论您要执行什么I / O操作,都需要该接口的实例。
  • java.nio.file.DirectoryStream :接口,其对象遍历目录的内容。
  • java.nio.file.DirectoryStream.filter <T> :一个嵌套接口,其对象决定是否应过滤目录中的元素。
  • java.nio.file.Files :带有对文件,目录等进行操作的静态方法的类。

我们用来过滤目录内容的方法是使用实​​现java.nio.file.DirectoryStream.filter <T>接口的对象。 此接口仅声明一个方法+ accept(T):boolean ,正如JavaDoc所说:“如果应接受目录条目,则返回true ”。 因此,取决于您要实现此方法,并根据您要使用的任何属性来决定是否应接受目录条目:隐藏,大小,所有者,创建日期等。记住这一点很重要,使用此方法方法,您不再局限于仅按名称进行过滤,可以使用任何其他属性。

如果只需要目录,则可以在创建过滤器时使用java.nio.file.Files类及其+ isDirectory(Path,LinkOption…):boolean方法:

//in a class.../*** Creates a filter for directories only* @return Object which implements DirectoryStream.Filter* interface and that accepts directories only.*/public static DirectoryStream.Filter<Path> getDirectoriesFilter() {DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.isDirectory(entry);}};return filter;}

或者,如果只需要隐藏文件,则可以在创建过滤器时使用java.nio.file.Files类及其+ isHidden(Path):boolean方法:

//in a class.../*** Creates a filter for hidden files only* @return Object which implements DirectoryStream.Filter* interface and that accepts hidden files only.*/public static DirectoryStream.Filter<Path> getHiddenFilesFilter() {DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.isHidden(entry);}};return filter;}

或者,如果您希望文件属于特定用户,则必须要求一个用户,并将其与目录条目的所有者进行比较。 要获取目录条目的所有者,可以使用java.nio.file.Files类及其+ getOwner(Path,LinkOption…):UserPrincipal方法(注意,并非所有的OS都支持此方法)。

要获取文件系统上的特定用户,请使用java.nio.file.FileSystem类及其+ getUserPrincipalLookupService() :

//in a class.../*** Creates a filter for owners* @return Object which implements DirectoryStream.Filter* interface and that accepts files that belongs to the * owner passed as parameter.*/public static DirectoryStream.Filter<Path> getOwnersFilter(String ownerName) throws IOException{UserPrincipalLookupService lookup = FileSystems.getDefault().getUserPrincipalLookupService();final UserPrincipal me = lookup.lookupPrincipalByName(ownerName);DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.getOwner(entry).equals(me);}};return filter;}

以下代码段定义了一种使用以前的任何过滤器扫描目录的方法:

//in a class.../*** Scans the directory using the filter passed as parameter.* @param folder directory to scan* @param filter Object which decides whether a * directory entry should be accepted*/private static void scan(String folder, DirectoryStream.Filter<Path> filter) {//obtains the Images directory in the app directoryPath dir = Paths.get(folder);//the Files class offers methods for validationif (!Files.exists(dir) || !Files.isDirectory(dir)) {System.out.println('No such directory!');return;}//validate the filterif (filter == null) {System.out.println('Please provide a filter.');return;}//Try with resources... so nice!try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir, filter)) {//iterate over the filtered content of the directory int count = 0;for (Path path : ds) {System.out.println(path.getFileName());count++;}System.out.println();System.out.printf('%d entries were accepted\n', count);} catch (IOException ex) {ex.printStackTrace();}}

我们可以通过将以下参数传递给main方法来执行前面的代码(请查看本文结尾处的源代码):

  • 要扫描的目录:C:\或/取决于您的操作系统。
  • 筛选条件:隐藏

执行代码时,我们得到以下信息:

在Windows计算机中,可以使用以下命令获取隐藏文件:
dir / AAH注意,我们得到的结果相同:

在我的Linux虚拟机上:

使用命令
ls -ald。*我们得到类似的结果:

再一次,写一次,到处运行!

希望您喜欢使用NIO.2系列进行文件过滤。 最后一点,我们回顾的所有过滤方法仅适用于一个目录,如果要扫描完整的目录树,则必须使用
java.nio.file.SimpleFileVisitor类。 单击此处下载此帖子的源代码。

参考: Java 7:使用NIO.2进行文件过滤–来自Java和ME博客的JCG合作伙伴 Alexis Lopez (第3部分) 。

翻译自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-3.html

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

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

相关文章

python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...

分治法求众数所属分类&#xff1a;数据结构开发工具&#xff1a;C/C文件大小&#xff1a;240KB下载次数&#xff1a;3上传日期&#xff1a;2018-01-04 20:19:09上 传 者&#xff1a;九鼎说明&#xff1a; 给定含有n个元素的多重集合S&#xff0c;每个元素在S中出现的次数称为该…

mysql 5.0 乱码,解决MySQL 5.0.16的乱码问题

导读&#xff1a;问&#xff1a;怎样解决MySQL 5.0.16的乱码问题?答&#xff1a;MySQL 5.0.16的乱码问题可以用下面的方法解决&#xff1a;1.设置phpMyAdminLanguage:Chinese simplified (zh-utf-8)MySQL 字符集&#xff1a;UTF-8 Unicode (utf8)MySQL 连接校对 gbk_chinese_c…

Hadoop Serialization -- hadoop序列化具体解释 (2)【Text,BytesWritable,NullWritable】

回想&#xff1a;回想序列化&#xff0c;事实上原书的结构非常清晰&#xff0c;我截图给出书中的章节结构&#xff1a;序列化最基本的&#xff0c;最底层的是实现writable接口&#xff0c;wiritable规定读和写的游戏规则 &#xff08;void write(DataOutput out) throws IOExce…

我需要多少个线程?

这取决于您的应用程序。 但是对于那些希望对如何从生产站点购买的所有昂贵内核中挤出更多资金的人来说&#xff0c;请多多包涵&#xff0c;我将阐明围绕多线程 Java应用程序的奥秘。 内容针对最典型的Java EE应用程序进行了“优化”&#xff0c;该应用程序具有Web前端&#xff…

H5网页适配 iPhoneX,就是这么简单

iPhoneX 取消了物理按键&#xff0c;改成底部小黑条&#xff0c;这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言&#xff0c;顶部&#xff08;刘海部位&#xff09;的适配问题浏览器已经做了处理&#xff0c;所以我们只需要关注底部与小黑条的适配问题即可&#…

python为什么closed_为什么python类的函数被调用两次[关闭](Why a function of python class is called twice [closed])...

为什么python类的函数被调用两次[关闭](Why a function of python class is called twice [closed])我遇到了两次调用的python类函数的问题。 我正在使用Spyder IDE。这是我的简单代码class Test:def f(self):print("a")from Test import *t Test()t.f()当我按“运行…

php关联数组和哈希表,php遍历哈希表及关联数组的实例代码

有关php数组的分类&#xff0c;PHP数组分为&#xff1a;数字索引数组和关联数组。其中数字索引数组和C语言中的数组一样&#xff0c;下标是为0&#xff0c;1&#xff0c;2…而关联数组下标可能是任意类型&#xff0c;与其它语言中的hash&#xff0c;map等结构相似。PHP遍历关联…

数字校园-云资源平台 2014.10.26-人人通共享空间

近期,教育部在统计学校信息化建设情况,当中一项重要内容,作为三通两平台的一个环节,就是学校开通人人通空间的情况,网上普及了一下知识,不就是十多年前就玩的学校博客的变种吗,网上有一些产品,也是没有热闹起来,为要求而要求的多,既然要求,就来一个吧,花了几天时间,也做了一个.…

VUE.js 中取得后台原生HTML字符串 原样显示问题

今天使用vue调试页面&#xff0c;发现了页面上的一个问题&#xff0c;后台数据传过来的HTML字符串并没有被转换为正常的HTML代码&#xff0c;一拍脑门&#xff0c;发现忘记转换了&#xff0c;于是满心欢喜加上了{{{}}}。但是之后构建发现报错&#xff1a; 为此去官网上查了下…

高性能持久消息

总览 尽管有许多可用于Java的高性能消息传递系统&#xff0c;但大多数都避免引用基准&#xff0c;包括持久消息传递和消息的序列化/反序列化。 这样做有很多原因。 1&#xff09;您并不总是需要或想要持久消息2&#xff09;您希望使用自己的序列化选项。 避免使用它们的一个重要…

python去掉重复内容并按原来次序输出元素_在Python中,从列表中删除重复项以使所有元素在保留顺序时都是唯一的最快的算法是什么?...

饮歌长啸使用方法&#xff1a;lst [8, 8, 9, 9, 7, 15, 15, 2, 20, 13, 2, 24, 6, 11, 7, 12, 4, 10, 18, 13, 23, 11, 3, 11, 12, 10, 4, 5, 4, 22, 6, 3, 19, 14, 21, 11, 1, 5, 14, 8, 0, 1, 16, 5, 10, 13, 17, 1, 16, 17, 12, 6, 10, 0, 3, 9, 9, 3, 7, 7, 6, 6, 7, 5, 1…

Lucene –快速添加索引和搜索功能

什么是Lucene&#xff1f; Apache LuceneTM是完全用Java编写的高性能&#xff0c;功能齐全的文本搜索引擎库。 它是一项适用于几乎所有需要全文搜索的应用程序的技术&#xff0c;尤其是跨平台的应用程序。 Lucene可以纯文本&#xff0c;整数&#xff0c;索引PDF&#xff0c;Of…

td 双击 编辑 php,双击表格td进行编辑

$(function(){//隔行换色// $("tbody tr:odd").css("background-color","#eee");var numId $(".tbody td");numId.dblclick(function(){var tdIns $(this);var tdpar $(this).parents("tr");//tdpar.remove();//current_…

前端开发之基础知识-HTML(一)

1.1 html概述和基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写&#xff0c;意思是超文本标记语言&#xff0c;超文本指的是超链接&#xff0c;标记指的是标签&#xff0c;是一种用来制作网页的语言&#xff0c;这种语言由一个个的标签组成&#xff0c;用…

nodejs的async异步编程

函数有&#xff1a; series waterfall parallel parallelLimit … series函数 串行执行 它的作用就是按照顺序一次执行。 async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { conso…

《深入理解Java虚拟机》读书笔记3--垃圾回收算法

转载&#xff1a;http://blog.csdn.net/tjiyu/article/details/53983064 下面先来了解Java虚拟机垃圾回收的几种常见算法&#xff1a;标记-清除算法、复制算法、标记-整理算法、分代收集算法、火车算法&#xff0c;介绍它们的算法思路&#xff0c;有什么优点和缺点&#xff0c;…

python常用函数中文_【python】python常用函数

urlencode与urldecode当url中包含中文或者参数包含中文&#xff0c;需要对中文或者特殊字符(/、&)做编码转换。urlencode的本质&#xff1a;把字符串转为gbk编码&#xff0c;再把\x替换成%。如果终端是utf8编码的&#xff0c;需要把结果再转成utf8输出&#xff0c;否则会乱…

带有批注的Spring硒测试

这篇文章描述了如何在Java中实现Selenium测试。 它的灵感来自Alex Collins的帖子&#xff0c;并带有注释。 该代码可在GitHub的Spring-Selenium-Test目录中找到。 一些替代方法和更轻巧的技术可用于对Spring MVC应用程序进行单元测试。 要进行单元测试服务&#xff0c;请参见此…

sizeof运算符

sizeof是一个单目运算符&#xff0c;它的运算对象是变量或数据类型&#xff0c;运算结果为一个整数。运算的一般形式如下: sizeof(<类型或变量名>) 它只针对数据类型&#xff0c;而不针对变量&#xff01; 若运算对象为变量&#xff0c;则所求的结果是这个变量占用的内存…

oracle 日志切换太频繁,诊断一次Oracle日志切换频繁的问题

日志切换&#xff0c;就是生成的日志太大&#xff0c;数据块的变化太频繁。Snap IdSnap TimeSessionsCursors/SessionBegin Snap:1456009-Dec-15 04:00:48594.5End Snap:1456109-Dec-15 05:00:59544.6Elapsed:60.19 (mins)DB Time:82.47 (mins)1s产生2M的日志。Per SecondPer T…