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接口来监听文件、文件夹变化,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • java文件操作之Path,Paths,Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.

  • java动态添加外部jar包到classpath的实例详解

    java动态添加外部jar包到classpath的实例详解 前言: 在项目开发过程中我们有时候需要动态的添加外部jar包,但是具体的业务需求还没有遇到过,因为如果动态添加外部jar包后,我们就需要修改业务代码,而修改代码就需要重新启动服务,那样好像就没有必要动态添加外部jar包了,怎么样才能不重新启动服务器就可以使用最新的代码我没有找到方法,如果各位知道的话给我点建议,回归主题,实现动态添加外部jar包到classpath的方法如下: String beanClassName = "com.dy

  • JAVA获取CLASSPATH路径的方法详解

    ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL getResource (String name); public InputStream getResourceAsStream (String name); 这里name是资源的类路径,它是相对与"/"根路径下的位置.getResource得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据. 但是真正使用的不是Cl

  • 基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.

  • 详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理"."和".."的情况 3.getCanonicalPath(): 返回的是规范化的绝对路径,相当于将getAbsolutePath()中的"."和".."解析成对应的正确的路径 第一个例子:(使用:".\\src\\test.txt&qu

  • Java利用WatchService监听文件变化示例

    在实现配置中心的多种方案中,有基于JDK7+的WatchService方法,其在单机应用中还是挺有实践的意义的. 代码如下: package com.longge.mytest; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardWatchEventKind

  • 详解Java中-classpath和路径的使用

    javac -classpath的使用: javac:如果当前你要编译的Java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面加上-classpath参数,通过使用以下三种类型的方法 来指导编译器在编译的时候去指定的路径下查找引用类. (1).绝对路径:javac -classpath c:/junit3.8.1/junit.jar   Xxx.java (2).相对路径:javac -classpath ../junit3

  • 深入XPath的详解以及Java示例代码分析

    复制代码 代码如下: import java.io.IOException;import javax.xml.parsers.*;import javax.xml.xpath.*;import org.w3c.dom.*;import org.xml.sax.SAXException;public class XpathTest { public static void main(String[] args) throws ParserConfigurationException,   SAXE

  • Java可以如何实现文件变动的监听的示例

    应用中使用logback作为日志输出组件的话,大部分会去配置 `logback.xml` 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别,不用重启应用就可以生效 那么,这个功能是怎么实现的呢? 应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别,不用重启应用就可以生效 那么,这个功能是怎么实现的呢? I. 问题描述及分析 针对上面的这个问题,首先抛出一个实际的

  • Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Java只提供了File类来操作文件.文件夹本身,功能有限,性能也不高. NIO.2为解决这种缺陷,提供了Path接口,并提供了Paths.Files2个工具类,这2个工具类包含的方法都是静态方法,Files类提供了大量的静态方法来操作文件.文件夹. Path接口.Paths工具类使用示例: //获

  • Nodejs监听日志文件的变化的过程解析

    最近有在做日志文件的分析,其中有一个需求:A服务器项目需要用Nodejs监听日志文件的变化,当项目产生了新的日志信息,将新的部分通过socket传输到B服务器项目.socket暂时不做分析. 这个需求很简单,通过分析我们开始撸码吧. 在撸码的过程中还能巩固所学Nodejs的API,何乐而不为呢? 所用的API fs.watchFile() 语法 fs.watchFile(filename[, options], listener) 参数解析 filename <string> | <Bu

  • android 监听SD卡文件变化的实现代码

    Android系统API提供了FileObserver抽象类(Linux的INotify机制)来监听系统/sdcard中的文件或文件夹,FileObserver类能对sdcard中的文件及文件夹的打开.创建.移动和删除操作进行监控.下面看看代码实现: (1)创建目录监听器: import android.os.FileObserver; import android.util.Log; /** * SD卡中的目录创建监听器. * * @author mayingcai */ public cla

  • Golang监听日志文件并发送到kafka中

    目录 前言 涉及的golang库和可视化工具: 工作的流程 环境准备 代码分层 关键的代码 main.go kafka.go tail.go 前言 日志收集项目的准备中,本文主要讲的是利用golang的tail库,监听日志文件的变动,将日志信息发送到kafka中. 涉及的golang库和可视化工具: go-ini,sarama,tail其中: go-ini:用于读取配置文件,统一管理配置项,有利于后其的维护 sarama:是一个go操作kafka的客户端.目前我用于向kefka发送消息 tail

  • vue前端测试开发watch监听data的数据变化

    目录 watch监听data的数据变化 新问题 解决 1. 先把姓名的值,也加到options里 2. 在监听里增加for循环和判断 watch监听data的数据变化 上一篇里提到了用elementUI的select实现了个远程搜索的功能,最终效果是这样的. 但是继续开发的时候,又遇到了一个新的问题,跟上面的功能有关. 先看下远程搜索的操作,与data里的数据关系. 当输入“张”进行搜索,看到的下拉列表里展示的结果都是存放在data的options: []. 当我选择了一个,比如“张三”,因为s

  • jquery监听div内容的变化具体实现思路

    我们做电子商务,javascript框架采用的是jQuery,在开发过程中遇到了上面标题列出的问题:如何监听div内容的变化. 先给出最终代码(后续进行相关分析): 复制代码 代码如下: var title = $("b.facility"); var title = $('#title');//the element I want to monitor title.bind('DOMNodeInserted', function(e) { alert('element now con

  • jQuery监听浏览器窗口大小的变化实例

    方法一:在标签上加入  onLoad="" onResize=""  方法  写上对应的方法即可 方法二:window.onresize=function(){///.....} 在方法里面写上对应的代码即可 着两种方法基本都可以解决问题. <script> function adjust(obj){ var div = document.getElementById("pad"); var txt = document.getEle

  • android 监听网络状态的变化及实战的示例代码

    平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误 没有网络的错误 在有网络的情况下,我们客户端的错误或者服务器端的错误 今天这篇博客主要阐述以下问题 怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用 网络没有打开情况下的处理,如弹出对话框,跳转到 打开 WiFi设置的界面等 非WiFi情况下是否加载图片,是否播放视频等 实现思路 在网络错误的情况下获取网络状态进行判断,这种方法是可行的,但你想过了没有,如果每次都要进行这样的判断,

  • 基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍

    如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="css/bootstrap.css" rel="external nofollow" >

  • 教你3分钟利用原生js实现有进度监听的文件上传预览组件

    前言 本文主要介绍如何使用原生js,通过面向对象的方式实现一个文件上传预览的组件,该组件利用FileReader来实现文件在前端的解析,预览,读取进度等功能,并对外暴露相应api来实现用户自定义的需求,比如文件上传,进度监听,自定义样式,读取成功回调等. 组件设计架构如下: 涉及的核心知识点如下: 闭包:减少变量污染,缩短变量查找范围 自执行函数 file API:对文件进行读取,解析,监控文件事件 DocumentFragment API:主要用来优化dom操作 minix :用来实现对象混合

随机推荐