java 接口文件夹_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接口来监听文件、文件夹变化,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对聚米学院网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

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

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

相关文章

python能制作游戏吗_没有Python不能做的游戏,这些游戏都可以做

简介:Python编程语言的强大,几乎是众所周知的!那么,下面我给大家介绍一下几个用Python实现的各种游戏吧。不仅能用来做web、爬虫、数据分析等,没想到还能用做这么多的游戏,实在令人惊讶不已。注意:以下介绍…

vba excel 退出编辑状态_偷梁换柱之EXCEL编辑保护和VBA隐藏代码保护的解锁

如何解锁EXCEL表格编辑保护和VBA隐藏代码保护?当我们想借用别人的表格发现表格上锁无法编辑又不知道密码时或者当我们用软件生成一些表格时往往会遇到“上锁”问题,导致我们无法对表格进行改动。类似下图这样:那怎么才能征服她呢?…

java使用的页面静态化技术_java秒杀系列(2)- 页面静态化技术

###前言通过代码片段分别介绍服务端渲染、客户端渲染、对象缓存三种方式的写法。代码片段仅供参考,具体实现需要根据业务场景自行适配,但思想都是一样。一、服务端渲染方式####1、接口返回html页面的设置javaAutowiredThymeleafViewResolver thymeleafVi…

activex for chrome扩展程序 下载”_Chrome扩展程序一键生成网页骨架屏

对于依赖接口渲染的页面,在拿到数据之前页面往往是空白的,为了提示用户当前正在加载中,往往会使用进度条、loading图标或骨架屏的方式。对于前两种方案而言,实现比较简单;本文主要研究骨架屏的应用及实现,并…

python定时器 循环_python从写定时器学习Thread

python从写定时器学习Threadpython 如何写一个定时器,循环定时做某一操作呢?Timer 对象from threading import Timerdef hello():print "hello, world"t Timer(10.0, hello)t.start()10秒后输出:hello, world重点研究 t Timer(10…

java创建链表成绩管理系统_成绩管理系统 链表版

1.[代码][C/C]代码/**********************************************************程序描述:学生成绩管理系统*运行环境:Windows 7 SP1 X64*开发环境:CodeBlocks with Win7*作者:耗子、*时间:2015.03******************…

dynamo python修改多个参数_python之函数

a.sort()没有返回值。而sorted(a)是有返回值的。Python的标准比较运算符&#xff1a;<、<、 > 、>、 、 !函数用法和底层分析&#xff1a;函数是一个可重用的程序代码块&#xff0c;函数也代表一个任务和功能&#xff08;function&#xff09;,是代码复用的通用机制…

python开发基础戴歆第四章_第一阶段:Python开发基础 day04 课后练习

第一阶段&#xff1a;Python开发基础 day04 课后作业1.简述python的五大数据类型的作用、定义方式、使用方法数字类型字符串类型列表字典布尔型答&#xff1a;数字类型分为整型(int)和浮点型(float)&#xff1a;整型的作用&#xff1a;表示人的年龄、各种号码、级别等定义方式&…

javascript进制转换_JavaScript 加减危机——为什么会出现这样的结果?

在日常工作计算中&#xff0c;我们如履薄冰&#xff0c;但是 JavaScript 总能给我们这样那样的 surprise~0.1 0.2 &#xff1f;1 - 0.9 &#xff1f;如果小伙伴给出内心的结果&#xff1a;0.1 0.2 0.31 - 0.9 0.1那么小伙伴会被事实狠狠地扇脸&#xff1a;console.log(0.…

python与golang_Golang与python线程详解及简单实例

Golang与python线程详解及简单实例在GO中&#xff0c;开启15个线程&#xff0c;每个线程把全局变量遍历增加100000次&#xff0c;因此预测结果是 15*1000001500000.var sum intvar cccc intvar m *sync.Mutexfunc Count1(i int, ch chan int) {for j : 0; j < 100000; j {cc…

java 树状 子节点_java构建树形列表(带children属性)

/*** 树形表格工具类**authoryanggb*/public classTreeTableUtil {/*** 把列表转换为树结构**paramoriginalList 原始list数据*paramidFieldName 作为唯一标示的字段名称*parampidFieldName 父节点标识字段名*paramchildrenFieldName 子节点(列表)标识字段名*return树结构列表*…

python输出文本内容_python 打印文件里的内容

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案 的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ... Mysql查找所有项目开始时间比之前项目结束时间小的项目ID 这是之前遇到…

python中八皇后如何运算的_python解决八皇后算法

展开全部global col #定义一些全局变量global rowglobal pos_diagglobal nag_diagglobal countdef output(): 输出一种有效结果global countprint rowcount 1def do_queen(i): 生成所有正确解param i: 皇后的数目for j in range(0, 8): #依次62616964757a686964616fe59b9ee7ad…

java实现复制粘贴的计算器_软帝学院教你用java编写计算器(三)

教你用java编写计算器(三)import java.awt.Color;import java.awt.Dimension;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax…

php 公众号验证回调方法_如何进行公众号文章收集 两种收集方法详解

大家都知道优质的公众号吸引用户最关键的就是要优质的文章&#xff0c;所以会有专人负责进行公众号文章收集工作&#xff0c;下面我们跟随拓途数据一起来了解一下如何进行公众号文章收集的相关资料吧。 如何进行公众号文章收集方案一&#xff1a;基于搜狗入口 在网上能搜索到的…

mysql保存一个文件怎么打开_悄悄告诉你,MySQL 通过SQL语句导出到Excel的方法-sql文件怎么打开...

执行SQL语句select fullname,time,endtime,closed from chat_archive into outfile c:/xxx.xls注意&#xff1a;因为office默认的是gb2312编码&#xff0c;服务器端生成的很有可能是utf-8编码&#xff0c;此时有几种选择1、把查询出来的结果转换为GB2312格式(字段fullname)sele…

gerber文件怎么导贴片坐标_SMT贴片机在线编程调试

SMT贴片机分为离线编程和在线编程调试&#xff0c;在线编程调试就是在 SMT 贴片机上对离线编程的程序进行优化调试编辑。SMT 贴片机在线编程调试总体上就是两个步骤&#xff0c;一个是离线编程的程序进行编程&#xff0c;然后就是总体检查并备份到贴片机电脑内。一、在 SMT 贴片…

java销售额查询_用JSP+JavaBean开发模式实现一个销售额的查询

数据库使用mysql&#xff0c;如下&#xff1a;vo包的Sales类&#xff1a;package com.vo;public class Sales {public String salestime;public float salesnum;public String getSalestime() {return salestime;}public void setSalestime(String salestime) {this.salestime …

python支持函数式编程么_Python 函数式编程

f absprint(f(-20))三、匿名函数其实就是指向函数的变量abs len# print(abs(-10))print(abs([1,2,3,4])四、高阶函数&#xff1a;能接收函数做参数的函数1.变量可以指向函数2.函数的参数可以接收变量3.一个函数可以接收另一个函数作为参数4.能接收函数作参数的函数就是高阶函…

spss数据_怎么建立SPSS数据库、录入数据?

怎么把收集的问卷、测试数据等原始资料转变为“SPSS数据库”&#xff1f;数据包括离散&#xff08;单选题、多选题等&#xff09;、连续&#xff08;年龄、身高、肺活量、人数等&#xff09;两类。以下面四个题目为例&#xff0c;介绍采用SPSS建立数据库的方法&#xff1a;A2.学…