Java NIO.2 使用Path接口来监听文件、文件夹变化
Java7对NIO进行了大的改进,新增了许多功能:
- 对文件系统的访问提供了全面的支持
- 提供了基于异步Channel的IO
这些新增的IO功能简称为 NIO.2,依然在java.nio包下。
早期的Java只提供了File类来操作文件、文件夹本身,功能有限,性能也不高。
NIO.2为解决这种缺陷,提供了Path接口,并提供了Paths、Files2个工具类,这2个工具类包含的方法都是静态方法,Files类提供了大量的静态方法来操作文件、文件夹。
Path接口、Paths工具类使用示例:
//获取指定路径的Path对象
Path path=Paths.get("D:/untitled/test/");
//也可以这样写: Path path=Paths.get("D","untitled","test"); 参数个数可变 //返回文件/文件夹名,test
System.out.println(path.getFileName());
//返回父目录的路径,D:\untitled
System.out.println(path.getParent());
//判断该路径的最后一级是否是指定的文件/文件夹,true。和String的endsWith有点不同。当参数是最后一级的文件/文件夹名时,才返回true。
System.out.println(path.endsWith("test"));
//以上方法的操作对象是Path对象中的路径,就是说路径不必是真实存在的 //返回根路径(盘符),D:\
System.out.println(path.getRoot());
//返会绝对路径
System.out.println(path.toAbsolutePath());
//以上获取的路径要是真实存在的
以前,如果要监控文件、目录的变化(新建、修改、删除),一般是启动一条后台线程,这条线程每隔一段时间去遍历指定目录的文件,如果此次遍历的结果与上次遍历的结果不同,就认为文件发生了变化。这种方式很繁琐,性能也低。
NIO.2的Path接口提供了一个方法来监听文件变化:
register(WatchService watcher, 要监听的事件类型1,要监听的事件类型2,.......) //注册一个监听服务
比如“xx安全卫士提醒您:xx程序将创建xx文件,是否允许?”、“xx程序试图修改xx文件,是否允许?”,就可使用此方法实现。
使用示例:
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
//创建一个文件系统的监听服务
WatchService watchService= FileSystems.getDefault().newWatchService();
Path path=Paths.get("D:/untitled/test");
//为该文件夹注册监听,监听新建、修改、删除事件。只能为文件夹(目录)注册监听,不能为单个文件注册监听
path.register(watchService,StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_MODIFY,StandardWatchEventKinds.ENTRY_DELETE);
//编写事件处理
while (true){ //一直监听
//拉取一个WatchKey。当触发监听的事件时,就会产生一个WatchKey,此WatchKey封装了事件信息。
WatchKey watchKey=watchService.take();
//使用循环是因为这一个WatchKey中可能有多个文件变化了,比如Ctrl+A全选,然后删除,只触发了一个WatchKey,但有多个文件变化了
for (WatchEvent event:watchKey.pollEvents()){
System.out.println(event.context()+"发生了"+event.kind()+"事件!");
/*
watchKey.pollEvents() 获取此次WatchKey中所有变化了的文件的信息,以List(列表)形式返回,一个WatchEvent就是一个元素,封装了一个变化了的文件的信息
event.context() 获取文件名
event.kind() 获取发生的事件类型
因为只能为文件夹注册监听,如果要监听某些指定的文件,可以在增强的for循环中,先根据event.context()判断是否是指定的文件,是才处理。
*/
}
//虽然是while()循环,但WatchKey和ByteBuffer一样,使用完要重置状态,才能继续用。
watchKey.reset(); //如果不重置,WatchKey使用一次过后就不能再使用,即只能监听到一次文件变化。
}
/*
测试:在D:/untitled/test目录下
1、新建1.txt文件 1.txt.txt发生了ENTRY_CREATE事件!
2、打开1.txt,输入"hello world!",并保存 1.txt.txt发生了ENTRY_MODIFY事件!
3、删除“hello world!",并保存 1.txt.txt发生了ENTRY_MODIFY事件!
4、新建2.txt文件 2.txt发生了ENTRY_CREATE事件!
说明:编辑文件内容时,不算修改,保存时才算修改。
5、新建文件夹“图片”
新建文件夹发生了ENTRY_CREATE事件!
新建文件夹发生了ENTRY_DELETE事件!
图片发生了ENTRY_CREATE事件!
OS执行过程:新建了一个名为“新建文件夹”的文件夹,再把此文件夹重命名为指定的名称。
重命名时,”新建文件夹“消失了,算作删除,”图片“出现了,算作新建。
6、在图片目录下,随便新建一个文件或者文件夹
图片发生了ENTRY_MODIFY事件!
说明监控的只是子文件、子文件夹,不会递归监控。
7、全选,删除test下所有文件、子文件夹
图片发生了ENTRY_DELETE事件!
1.txt.txt发生了ENTRY_DELETE事件!
2.txt发生了ENTRY_DELETE事件!
*/
}
}
拉取一个WatchKey有3种方法:
- WatchKey take() //阻塞式拉取,如果未拉取到,会一直等待,直到拉取到一个WatchKey。一般我们用这个。
- WatchKey poll() //非阻塞式拉取,试图拉取一个WatchKey,拉取到了就返回拉取的WatchKey对象,没有WatchKey发生就立即返回null。
- WatchKey poll(long timeout, TimeUnit unit) //非阻塞式拉取,如果没拉取到,会再等待timeout毫秒,还没拉取到才返回null。
Java NIO.2 使用Path接口来监听文件、文件夹变化的更多相关文章
- Java NIO学习(Path接口、Paths和Files工具类的使用)
NIO学习:Paths和Files工具类的使用 JDK1.7引入了新的IO操作类.在java.nio.file包下,Java NIO Path接口和Files类. Path接口:Path表示的是一个目 ...
- Java Swing类 例子代码:将子类继承JFrame 并且接口按键监听ActionLisetener (将内容直接添加到JFrame不创建Contaniner)
package rom; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import ...
- JAVA nio 2 定义 Path 类
一旦确认了文件系统上的一个文件或目录,那么就可以定义一个 Path 类来指向它.定义 Path 类可以使用绝对路径.相对路径.路径中带有一个点号“.”(表示当前目录).路径中带有两个点“..”(表示上 ...
- JAVA nio 2 和 Path 类简介
想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.fi ...
- [Java聊天室server]实战之二 监听类
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- js 实时监听input中值变化
注意:用到了jquery需要引入jquery.min.js. 需求: 1.每个地方需要分别打分,总分为100; 2.第一个打分总分为40; 3.第二个打分总分为60. 注意:需要判断null.&quo ...
- ORACLE清理、截断监听日志文件(listener.log)
在ORACLE数据库中,如果不对监听日志文件(listener.log)进行截断,那么监听日志文件(listener.log)会变得越来越大,想必不少人听说过关于"LISTENER.LOG日 ...
- 文件下载Controller,文件夹内容监听,文件上传,运行程序通过url实现文件下载
文件下载Controller @RequestMapping("/fileDownLoad") public ResponseEntity<byte[]> fileDo ...
- javascript --- 实时监听输入框值的变化
实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输 ...
随机推荐
- James Bach Rapid Test的感受
前阶段拜读过James大神的快速测试,英文水平有限,阅读起来有点吃力,虽然想亲自参加大神的培训,一直没有机会,不过阿里牛人参加大神的培训,并总结的不错,现在谈谈自己的感想和看法. 进入测试行业不少年了 ...
- Android使用Glide加载Gif.解决Glide加载Gif非常慢问题
在Glide文档中找了半天没发现加载Gif的方式.然后通过基本的用法去加载: Glide.with(MainActivity.this).load(url).asGif().into(imageVie ...
- Redis实现之数据库(三)
过期键删除策略 在Redis实现之数据库(二)一小节中,我们知道了数据库键的过期时间都保存在过期字典中,又知道了如果根据过期时间去判断一个键是否过期,现在剩下的问题是:如果一个键过期了,那么它什么时候 ...
- 使用 Dom4j 将 XML 转换为 MAP
本文为转载:http://blog.sina.com.cn/s/blog_6145ed810100z164.html 原文地址. 自己仅作备忘录方便查找留了一份. 这是解析Xml 的辅助类 pack ...
- day02_04.算算多少人
第四题 算算有多少人? 第二题的升级版,看看你能不能做出来 利用你的编程思想去看这道题目,记住不要放过题目的每一个小细节 题目:操场上100多人排队,3人一组多1人,4个一组多2人,5人一组多3人,共 ...
- python实现删除空文件夹 附源代码
前言:空文件夹虽然不占空间,但是有时候看着确实挺烦的(别误会,我不是强迫症!),所以写了一个用于删除当前目录下的空文件夹的小程序 环境:win7 64位:python2.7:IDE pycharm20 ...
- 理解机器为什么可以学习(二)---Training versus Testing
前边由Hoeffding出发讨论了为什么机器可以学习,主要就是在N很大的时候Ein PAC Eout,选择较小的Ein,这样的Eout也较小,但是当时还有一个问题没有解决,就是当时的假设的h的集合是个 ...
- maven学习(一)——maven的下载与安装
一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...
- [SDOI2016][bzoj4514] 数字配对 [费用流]
题面 传送门 思路 一个数字能且只能匹配一次 这引导我们思考:一次代表什么?代表用到一定上限(b数组)就不能再用,同时每用一次会产生价值(c数组) 上限?价值?网络流! 把一次匹配设为一点流量,那产生 ...
- Codevs 1040 统计单词个数
1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的 ...