java8 监控文件变化_[Java 8] (4) 列举目录下的所有文件和监视文件变化
列举目录中的所有文件
首先给出代码:
Files.list(Paths.get(".")).forEach(System.out::println);
Files.list方法得到的是一个Stream类型的对象,它代表了目标路径下所有的文件。如果只想获取目标路径下的所有目录文件:
Files.list(Paths.get("."))
.filter(Files::isDirectory)
.forEach(System.out::println);
在以前的Java版本中,如果需要实现一个自定义的过滤器,那么通常会选择使用FilenameFilter结合匿名类的方式:
final String[] files =
new File("target_dir").list(new java.io.FilenameFilter() {
public boolean accept(final File dir, final String name) {
return name.endsWith(".java");
}
});
System.out.println(files);
我们说过,当遇见了匿名内部类的时候,如果被实现的接口是一个函数式接口,那么可以考虑将该匿名内部类以Lambda表达式的形式重新实现,再结合Java 8中新添加的DirectoryStream,可以将上述代码重新实现为:
Files.newDirectoryStream(
Paths.get("target_dir"),
path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
当目标目录下含有大量的文件或者子目录时,使用DirectoryStream往往会具有更好的性能。因为它实际上是一个Iterator用来遍历目标目录,而直接使用listFiles方法时,得到的是一个代表了所有文件和目录的数组,意味着内存的开销会更大。
使用flatMap列举所有直接子目录
所谓的直接子目录(Immediate Subdirectory),指的就是目标目录下一级的所有目录。对于这样一个任务,最直观的实现方式恐怕是这样的:
public static void listTheHardWay() {
List files = new ArrayList<>();
File[] filesInCurerentDir = new File(".").listFiles();
for(File file : filesInCurerentDir) {
File[] filesInSubDir = file.listFiles();
if(filesInSubDir != null) {
files.addAll(Arrays.asList(filesInSubDir));
} else {
files.add(file);
}
}
System.out.println("Count: " + files.size());
}
很显然,此段代码噪声太多,没有清晰地反映出代码的整体目标。下面就用flatMap方法来简化它:
public static void betterWay() {
List files = Stream.of(new File(".").listFiles())
.flatMap(file -> file.listFiles() == null ?
Stream.of(file) : Stream.of(file.listFiles()))
.collect(toList());
System.out.println("Count: " + files.size());
}
// flatMap
Stream flatMap(Function super T, ? extends Stream extends R>> mapper);
从flatMap方法的签名来看,它接受了一个Function接口作为参数,将一种类型转换为另一种类型的Stream类型。而从flatMap方法的命令来看,它的执行过程主要包含两个步骤:
首先是会对当前Stream的每个元素执行一次map操作,根据传入的mapper对象将一个元素转换为对应的Stream对象将第一步中得到的若干个Stream对象汇集成一个Stream对象
从上面的代码来看,签名中的T类型就是File类型,而R类型同样也是File类型。当一个File对象不含有任何的子目录或者子文件时,那么通过Stream.of(file)来仅仅包含它自身,否则使用Stream.of(file.listFiles())来包含其下的所有子目录和子文件。
监视文件变化
WatchService是Java 7中新添加的一个特性,用来监视一某个路径下的文件或者目录是否发生了变化。
final Path path = Paths.get(".");
final WatchService watchService = path.getFileSystem().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
System.out.println("Report any file changed within next 1 minutes...");
注册了需要监视的目录后,需要使用WatchKey来得到一段时间内的,该目录的变化情况:
final WatchKey watchKey = watchService.poll(1, TimeUnit.MINUTES);
if(watchKey != null) {
watchKey.pollEvents().stream().forEach(event ->
System.out.println(event.context()));
}
这里使用了Java 8中的内部遍历器forEach来完成对于事件的遍历。这也算是一个Java 7和Java 8特性的联合使用吧。
java8 监控文件变化_[Java 8] (4) 列举目录下的所有文件和监视文件变化相关推荐
- 通过url下载文件保存到指定的不存在目录下
通过url下载文件保存到指定的不存在目录下 从网络Url中下载文件 /*** 从网络Url中下载文件* @param urlStr* @param fileName* @param savePath* ...
- java批量提取文件夹名称_bat 批量提取指定目录下的文件名
bat 批量提取指定目录下的文件名 下面是批量获取指定目录下的文件名的核心代码 @echo off echo text input set input= set /p input=: echo %in ...
- scala学习-12-scala读取java项目下Src目录下的properties文件
1.概述 scala读取java项目下Src目录下的properties文件 package scalaimport java.util.Properties import java.io.FileI ...
- 怎么读取h5文件内容_【Python编程特训连载72】读取two.txt文件,模拟输出“两会”内容 答案公布...
董明珠是中国产业界的女强人,她曾经说过 "两会"的名言:"成功人的两会:开会,培训会.普通人的两会:约会,聚会.穷人的两会:这也不会,那也不会.奋斗的人两会:必须会,一定 ...
- linux查找日期目录,详解Linux查找目录下的按时间过滤的文件
在维护项目中,有时会指定都一些条件进行过滤文件,并对该批文件进行操作:这时我们将使用shell命令进行操作:直接上代码 #!/bin/sh #BEGIN #`find ./ ! -name " ...
- 位于/var/log目录下的20个Linux日志文件
位于/var/log目录下的20个Linux日志文件[译] from:http://buptguo.com/2014/01/16/linux-var-log-files/ 原文地址:20 Linux ...
- python文件操作2:在指定目录下查找指定后缀名的文件
在指定目录下查找指定后缀名的文件,要查找所有子目录,返回文件路径名列表 import osdef get_full_filelist(base_dir='.', target_ext='') -> ...
- python 文件处理1:将某一目录下的文件合并
导入库函数 import os 函数1:在指定目录下查找指定后缀名的文件,不查找子目录,返回文件路径名列表. 默认在当前目录下查找,不指定后缀名. def get_filelist(base_dir= ...
- linux依据时间过滤文件,详解Linux查找目录下的按时间过滤的文件
在维护项目中,有时会指定都一些条件进行过滤文件,并对该批文件进行操作:这时我们将使用shell命令进行操作:直接上代码 #!/bin/sh #BEGIN #`find ./ ! -name " ...
最新文章
- Unity 2D游戏开发教程之摄像头追踪功能
- 商务部数据揭示了零售行业的哪些新趋势?
- 用Red5搭建支持WEB播放的实时监控视频
- Django07:模板语法/标签/inclusion_tag/模版的继承
- Linux下查看CPU个数(逻辑个数和物理个数)
- Django admin 继承user表后密码为明文,继承UserAdmin,重写其方法
- Ubuntu18.04配置TeXLive2020+TeXstudio
- Python 面向对象 —— __slots__ 与 @property(python 下的 getter、setter 方法)
- node.js 实现udp传输_nodejs实现UDP组播示例方法
- excel合并两列内容_Python实战:合并 Excel 表格
- php今日头条抓取正文,今日头条文章爬虫采集 - 八爪鱼采集器
- python 阮一峰_阮一峰:Fish shell 入门教程
- 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
- 【问题解决】电脑连接自家WiFi不能进B站而手机能进
- 服务器登录 微信提醒,微信提示非常用设备登陆解决办法
- 学历对于人工智能方向重要吗
- 印象笔记Mac版的快捷键有哪些?
- 周鸿祎谈5G时代网络安全:手机病毒可能会更猖狂
- Ubuntu20.04 安装ROS2 Foxy
- 模拟高清的种类分布:CVI,TVI,AHD