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()+"事件!");
}
//虽然是while()循环,但WatchKey和ByteBuffer一样,使用完要重置状态,才能继续用。
watchKey.reset(); //如果不重置,WatchKey使用一次过后就不能再使用,即只能监听到一次文件变化。
}
}
}
拉取一个WatchKey有3种方法:
•WatchKey take() //阻塞式拉取,如果未拉取到,会一直等待,直到拉取到一个WatchKey。一般我们用这个。
•WatchKey poll() //非阻塞式拉取,试图拉取一个WatchKey,拉取到了就返回拉取的WatchKey对象,没有WatchKey发生就立即返回null。
•WatchKey poll(long timeout, TimeUnit unit) //非阻塞式拉取,如果没拉取到,会再等待timeout毫秒,还没拉取到才返回null。
总结
以上所述是小编给大家介绍的Java NIO.2 使用Path接口来监听文件、文件夹变化,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!



