JAVA 文件监控 WatchService的示例方法

概述

java1.7中 提供了WatchService来监控系统中文件的变化。该监控是基于操作系统的文件系统监控器,可以监控系统是所有文件的变化,这种监控是无需遍历、无需比较的,是一种基于信号收发的监控,因此效率一定是最高的;现在Java对其进行了包装,可以直接在Java程序中使用OS的文件系统监控器了。

使用场景

  1. 场景一:比如系统中的配置文件,一般都是系统启动的时候只加载一次,如果想修改配置文件,还须重启系统。如果系统想热加载一般都会定时轮询对比配置文件是否修改过,如果修改过重新加载。
  2. 场景二:监控磁盘中的文件变化,一般需要把磁盘中的所有文件全部加载一边,定期轮询一遍磁盘,跟上次的文件状态对比。如果文件、目录过多,每次遍历时间都很长,而且还不是实时监控。

而以上两种场景就比较适合使用 WatchService 进行文件监控。

示例

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;

public class FileWatchServiceDemo {

  public static void main(String[] args) throws IOException, InterruptedException {
    WatchService watchService = FileSystems.getDefault().newWatchService();

    String filePath = "D:/aa";

    Paths.get(filePath).register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
        StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

    while(true){
      WatchKey key = watchService.take();
      List<WatchEvent<?>> watchEvents = key.pollEvents();
      for (WatchEvent<?> event : watchEvents) {
        if(StandardWatchEventKinds.ENTRY_CREATE == event.kind()){
          System.out.println("创建:[" + filePath + "/" + event.context() + "]");
        }
        if(StandardWatchEventKinds.ENTRY_MODIFY == event.kind()){
          System.out.println("修改:[" + filePath + "/" + event.context() + "]");
        }
        if(StandardWatchEventKinds.ENTRY_DELETE == event.kind()){
          System.out.println("删除:[" + filePath + "/" + event.context() + "]");
        }

      }
      key.reset();
    }
  }
}

1、使用 Path 来指定要监控的目录

2、Path.register() 方法注册要监控指定目录的那些事件(创建、修改、删除)

 StandardWatchEventKinds.ENTRY_CREATE //创建
 StandardWatchEventKinds.ENTRY_MODIFY //修改
 StandardWatchEventKinds.ENTRY_DELETE //删除

3、调用watchService.take(); 获取监控目录文件的变化的WatchKey。该方法是阻塞方法,如果没有文件修改,则一直阻塞。

4、遍历所有的修改事件,并做相应处理。

5、完成一次监控就需要重置监控器。

不使用 WatchService 监控的弊端

  1. 非常繁琐,必须自己手动开启一个后台线程每隔一段时间遍历一次目标节点并记录当前状态,然后和上一次遍历的状态对比,如果不相同就表示发生了变化,再采取相应的操作,这个过程非常长,都需要用户自己手动实现;
  2. 效率低:效率都消耗在了遍历、保存状态、对比状态上了!这是因为旧版本的Java无法很好的利用OS文件系统的功能,因此只能这样笨拙地监控文件变化;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java使用WatchService监控文件夹示例

    通过java7提供的WatchService API 实现对文件夹的监控 package service; import config.Config; import java.io.IOException; import java.nio.file.*; import java.util.List; import java.util.concurrent.TimeUnit; public class WatchDirService { private WatchService watchServ

  • Java使用WatchService监控文件内容变化的示例

    场景 系统实现中经常需要能够感知配置文件的变化,然后及时更新上下文. 实现方案 自己起一个单独线程,定时加载文件,实现较简单,但是无法保证能够实时捕捉文件变化,同时耗CPU 使用commons-io中的 FileAlterationObserver,思想和上面类似,对比前后文件列表的变化,触发对应事件 JDK 1.7提供的WatchService,利用底层文件系统提供的功能 使用 WatchService WatchService用来监控一个目录是否发生改变,但是可以通过 WatchEvent

  • 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 文件监控 WatchService的示例方法

    概述 java1.7中 提供了WatchService来监控系统中文件的变化.该监控是基于操作系统的文件系统监控器,可以监控系统是所有文件的变化,这种监控是无需遍历.无需比较的,是一种基于信号收发的监控,因此效率一定是最高的:现在Java对其进行了包装,可以直接在Java程序中使用OS的文件系统监控器了. 使用场景 场景一:比如系统中的配置文件,一般都是系统启动的时候只加载一次,如果想修改配置文件,还须重启系统.如果系统想热加载一般都会定时轮询对比配置文件是否修改过,如果修改过重新加载. 场景二

  • 用python删除java文件头上版权信息的方法

    在使用他人代码时,为不保留文件头部版权信息,需要一个个删掉,费时费力, 写了个脚本,简单清除掉目录下所有的文件的头部版权信息. # -*- coding: utf8 -*- ''''' 删除java文件头部的版权等注释 package之上的部分 ''' import os import sys def delHeader(filepath): if os.path.exists(filepath) : file = open(filepath) lines = file.readlines()

  • java.nio.file.WatchService 实时监控文件变化的示例代码

    目录 1.示例代码 2.其实并没有实时 在平时的开发过程中,会有很多场景需要实时监听文件的变化,如下:1.通过实时监控 mysql 的 binlog 日志实现数据同步2.修改配置文件后,希望系统可以实时感知3.应用系统将日志写入文件中,日志监控系统可以实时抓取日志,分析日志内容并进行报警4.类似 ide 工具,可以实时感知管理的工程下的文件变更 在 Java 语言中,从 JDK7 开始,新增了java.nio.file.WatchService类,用来实时监控文件的变化. 1.示例代码 File

  • Java压缩文件工具类ZipUtil使用方法代码示例

    本文实例通过Java的Zip输入输出流实现压缩和解压文件,前一部分代码实现获取文件路径,压缩文件名的更改等,具体如下: package com.utility.zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import

  • java实现一次性压缩多个文件到zip中的方法示例

    本文实例讲述了java实现一次性压缩多个文件到zip中的方法.分享给大家供大家参考,具体如下: 1.需要引入包: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntr

  • Java用GDAL读写shapefile的方法示例

    GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式.它还有一系列命令行工具来进行数据转换和处理. GDAL官方网址:http://www.gdal.org/,它能支持当前流行的各种地图数据格式,包括栅格和矢量地图,具体参考官方网站.该库使用C/C++开发,在Java中使用需要自己编译,具体编译过程这里就不说了,下面来看看本文的主要内容吧. Java使用G

  • Java实现整数分解质因数的方法示例

    本文实例讲述了Java实现整数分解质因数的方法.分享给大家供大家参考,具体如下: 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数. 比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式:当读到的就是素数时,输出它本身. 输入格式: 一个整数,范围在[2,100000]内. 输出格式: 形如: n=axbxcxd 或 n=n 所有的符号之间都

  • Java实现的模糊匹配某文件夹下的文件并删除功能示例

    本文实例讲述了Java实现的模糊匹配某文件夹下的文件并删除功能.分享给大家供大家参考,具体如下: package com.wyebd.gis; import java.io.File; /** * @Title: DelFiles.java * @Package com.wyebd.gis * @Description: * @author lisr * @date Mar 7, 2012 5:36:03 PM * @version V1.0 */ public class DelFiles {

  • Java动态数组添加数据的方法与应用示例

    本文实例讲述了Java动态数组添加数据的方法与应用.分享给大家供大家参考,具体如下: 输入客户的姓名,客户的人数不定.待输入完成后,请打印出客户的名单,并定义一个方法查询客户是否在这些客户中. 代码示例: package com.jredu.ch06.exer; import java.util.Arrays; import java.util.Scanner; public class CustomBiz { public String[] custom; public void addNam

  • Java实现一个简单的文件上传案例示例代码

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘中 下面上代码 上传单个文件 服务器端 package FileUpload; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Serve

随机推荐