Java实现文件变化监控

一. spring配置文件:

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<!-- 文件监测器 -->
<bean id="monitor"
class="com.interfaces.file.monitor.FileMonitorImpl">
<constructor-arg index="0" value="10000" /> <!-- 监测时间间隔,单位:毫秒 -->
<constructor-arg index="1" ref="observer" /> <!-- 文件观察器 -->
</bean>
<!-- 文件观察器 -->
<bean id="observer"
class="com.interfaces.file.monitor.FileObserverImpl">
<constructor-arg index="0" value="D:\\UploadDir"/> <!-- 观察的目录 -->
<constructor-arg index="1" ref="filter"/> <!-- 文件过滤器-->
<constructor-arg index="2" ref="listener"/> <!-- 文件监听器 -->
</bean>
<!-- 文件监听器 -->
<bean id="listener"
class="com.interfaces.file.monitor.FileListener"/>
<!-- 文件过滤器 -->
<bean id="filter"
class="com.interfaces.file.monitor.FileFilterImpl">
<!--
指定文件扩展名,只有指定的扩展名文件会被处理。
不同的扩展名间以 "," 间隔,如:xml,txt,bak
-->
<constructor-arg index="0" value="xml"/>
</bean>
</beans>

二. spring上下文加载监听器:

SpringContextLoaderListener.class

import javax.servlet.ServletContextEvent;
import org.springframework.web.context.ContextLoaderListener;
public class SpringContextLoaderListener extends ContextLoaderListener{
@Override
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);
FileMonitor scanner = getScanner();
// 启动目录扫描器
scanner.start();
}
@Override
public void contextDestroyed(ServletContextEvent event) {
FileMonitor scanner = getScanner();
// 关闭目录扫描器
scanner.stop();
super.contextDestroyed(event);
}
/**
* 获取目录扫描器
* @return
*/
private FileMonitor getScanner() {
return getCurrentWebApplicationContext().getBean(FileMonitor.class);
}
}

三. web工程配置文件:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.4">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:application.xml
</param-value>
</context-param>
<listener>
<listener-class>com.web.SpringContextLoaderListener</listener-class>
</listener>
</web-app>

四. 文件监测器

  1. 接口:FileMonitor.class

import org.apache.commons.io.monitor.FileAlterationObserver;
/**
* 文件监测器角色
*/
public interface FileMonitor {
/**
* 注册观察器
* @param observer 观察器
*/
void addObserver(FileAlterationObserver observer);
/**
* 删除观察器
* @param observer 观察器
*/
void removeObserver(FileAlterationObserver observer);
/**
* 获取注册的所有观察器
* @return 观察器集合
*/
Iterable<FileAlterationObserver> getObservers();
/**
* 启动监测器
*/
void start();
/**
* 停止监测器
*/
void stop();
/**
* 获取监测间隔时间
* @return 间隔时间(单位:毫秒)
*/
long getInterval();
}

  2. 实现类:FileMonitorImpl.class

import java.util.concurrent.ThreadFactory;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
/**
* 监测器,监测时间间隔,设置文件观察器
*/
public class FileMonitorImpl implements FileMonitor{
private final FileAlterationMonitor monitor;
/**
* 监测器线程名称
*/
private static final String MONITOR_THREAD_NAME = "File MONITOR Daemon";
/**
* 监测器线程Daemon标记
*/
private static final boolean DAEMON = false;
/**
* 定义监测时间间隔、文件观察器
* @param interval 监测时间间隔
* @param observer 文件观察者
*/
FileMonitorImpl(int interval, final FileAlterationObserver observer) {
this(interval, observer,
new BasicThreadFactory.Builder().
namingPattern(MONITOR_THREAD_NAME).daemon(DAEMON).build());
}
/**
* 定义监测时间间隔、文件观察器和线程工厂
* @param interval 监测时间间隔
* @param observer 文件观察器
* @param factory 线程工厂
*/
FileMonitorImpl(int interval, final FileAlterationObserver observer,
final ThreadFactory factory) {
this.monitor = new FileAlterationMonitor(interval, new FileAlterationObserver[] { observer });
monitor.setThreadFactory(factory);
}
/**
* 添加文件观察器
* @param observer
*/
@Override
public void addObserver(FileAlterationObserver observer) {
monitor.addObserver(observer);
}
/**
* 删除文件观察器
* @param observer
*/
@Override
public void removeObserver(FileAlterationObserver observer) {
monitor.removeObserver(observer);
}
/**
* 获取注册的所有观察器
* @return
*/
@Override
public Iterable<FileAlterationObserver> getObservers() {
return monitor.getObservers();
}
/**
* 启动监测器
*/
@Override
public void start() {
try {
monitor.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 停止监测器
*/
@Override
public void stop() {
try {
monitor.stop();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取监测时间间隔
*/
@Override
public long getInterval() {
return monitor.getInterval();
}
} 

五. 文件观察器

  1. 接口:FileObserver.class

import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListener;
/**
* 文件观察器角色
*/
public interface FileObserver {
/**
* 添加监听器
* @param listener
*/
void addListener(final FileAlterationListener listener);
/**
* 删除监听器
* @param listener
*/
void removeListener(final FileAlterationListener listener);
/**
* 获取注册的监听器
* @return
*/
Iterable<FileAlterationListener> getListeners();
/**
* 初始化观察器
* @throws Exception
*/
void initialize() throws Exception;
/**
* 销毁观察器
* @throws Exception
*/
void destroy() throws Exception;
/**
* 获取观察的目录
* @return
*/
File getDirectory();
/**
* 获取文件过滤器
*
* @return
*/
public FileFilter getFilter();
} 

  2. 实现类:FileObserverImpl.class

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;
/**
* 文件观察器
*
* 当有文件创建、删除、或变更动作时,则消息通知监听器
*/
public class FileObserverImpl extends FileAlterationObserver implements FileObserver{
private static final long serialVersionUID = -7239227289538993830L;
/**
* 文件过滤器
*/
private final FileFilter filter;
/**
* 设置要监听观察的目录,并设置文件过滤器和监听器,用以观察指定具有指定扩展名的文件
* @param dir 观察监听的目录
* @param filter 文件过滤器
* @param listener 文件监听器
*/
public FileObserverImpl(String dir, final FileFilter filter,
FileAlterationListener listener) {
super(dir, filter, (IOCase) null);
addListener(listener);
this.filter = filter;
File directory = new File(dir);
// 如果目录不存在
if(!directory.exists()) {
try {
FileUtils.forceMkdir(directory);
}
catch (IOException e) {
e.printStackTrace();
}
}
// 如果存在的是文件
else if(directory.exists() && directory.isFile()) {
try {
FileUtils.forceDelete(directory);
FileUtils.forceMkdir(directory);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 添加监听器
*/
@Override
public void addListener(final FileAlterationListener listener) {
super.addListener(listener);
}
/**
* 移除监听器
*/
@Override
public void removeListener(final FileAlterationListener listener) {
super.removeListener(listener);
}
/**
* 获取观察者对象的所有监听器
*/
@Override
public Iterable<FileAlterationListener> getListeners() {
return super.getListeners();
}
/**
* 初始化文件观察者
*/
@Override
public void initialize() throws Exception {
super.initialize();
}
/**
* 销毁文件观察者
*/
@Override
public void destroy() throws Exception {
super.destroy();
}
/**
* 获取所观察的目录
*/
@Override
public File getDirectory() {
return super.getDirectory();
}
/**
* 获取文件过滤器
* @return
*/
public FileFilter getFilter() {
return filter;
}
}

六. 文件监听器:

FileListener.class

import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
/**
* 文件监听器
*/
public final class FileListener extends FileAlterationListenerAdaptor {
/**
* 文件创建时执行的动作
*/
@Override
public void onFileCreate(File file) {
// To do something
}
/**
* 文件删除(转移)时执行的动作
*/
@Override
public void onFileDelete(File file) {
// To do something
}
/**
* 文件内容改变时执行的动作
*/
@Override
public void onFileChange(File file) {
// To do something
}
/**
* 开始执行监听时执行的动作
*/
@Override
public void onStart(FileAlterationObserver observer) {
// To do something
}
/**
* 停止监听时执行的动作
*/
@Override
public void onStop(FileAlterationObserver observer) {
// To do something
}
}

七. 文件过滤器

  1. 接口:FileFilter.class

/**
* 文件过滤器角色,扩展自java.io.FileFilter
*/
public interface FileFilter extends java.io.FileFilter {
/**
* 获取定义的扩展名
*
* @return
*/
String[] getExtensions();
}

  2. 实现类:

FileFilterImpl.class

import java.io.File;
import org.apache.commons.io.FilenameUtils;
/**
* 文件过滤器
*/
public class FileFilterImpl implements FileFilter{
private String[] extensions;
public FileFilterImpl(String... extensions) {
this.extensions = extensions;
}
/**
* 是否接受该文件
*/
@Override
public boolean accept(File pathname) {
return FilenameUtils.isExtension(pathname.getName(), extensions);
}
/**
* 获取定义的扩展名
* @return
*/
@Override
public String[] getExtensions() {
return extensions;
}
}

以上所述是小编给大家介绍的Java实现文件变化监控,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java 使用线程监控文件目录变化的实现方法

    java 使用线程监控文件目录变化的实现方法 由于某种特殊的需求.弄了个使用线程监控文件目录变化的 代码基本如下.其中减去一些复杂的操作.只留下基本代码: package com.file; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public

  • Java函数式编程(十二):监控文件修改

    使用flatMap列出子目录 前面已经看到如何列出指定目录下的文件了.我们再来看下如何遍历指定目录的直接子目录(深度为1),先实现一个简单的版本,然后再用更方便的flatMap()方法来实现. 我们先用传统的for循环来遍历一个指定的目录.如果子目录中有文件,就添加到列表里:否则就把子目录添加到列表里.最后,打印出所有文件的总数.代码在下面--这个是困难模式的. 复制代码 代码如下: public static void listTheHardWay() {      List<File> f

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

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

  • Java实时监控日志文件并输出的方法详解

    前言 最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据是新增加的,通过查看JDK 的帮助文档, java.io.RandomAccessFile可以解决这个问题.为了模拟这个问题,编写LogSvr和 LogView类,LogSvr不断向mock.log日志文件写数据,而 LogView则实时输出日志变化部分的数据. 代码1:日志产生类 package

  • 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实现文件变化监控的方法(推荐)

    一. spring配置文件:application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://ww

  • Java实现文件变化监控

    一. spring配置文件: application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://w

  • python中文件变化监控示例(watchdog)

    在python中文件监控主要有两个库,一个是pyinotify ( https://github.com/seb-m/pyinotify/wiki),一个是watchdog(http://pythonhosted.org/watchdog/).pyinotify依赖于Linux平台的inotify,后者则对不同平台的的事件都进行了封装.因为我主要用于Windows平台,所以下面着重介绍watchdog(推荐大家阅读一下watchdog实现源码,有利于深刻的理解其中的原理). watchdog在不

  • Java实现实时监控目录下文件变化的方法

    一.commons-io方法 1.使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的创建.删除和修改 (2)可以监控文件的创建.删除和修改 (3)采用的是观察者模式来实现的 (4)采用线程去定时去刷新检测文件的变化情况 2.引入commons-io包,需要2.0以上. <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <depend

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

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

  • Java实现监听文件变化的三种方案详解

    目录 背景 方案一:定时任务 + File#lastModified 方案二:WatchService 方案三:Apache Commons-IO 小结 背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监听等都会遇到类似的场景. 本文给大家提供三种解决方案,并分析其中的利弊,建议收藏,以备不时之需. 方案一:定时任务 + File#lastModi

  • 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

  • 利用nodejs监控文件变化并使用sftp上传到服务器

    最近在用react+express做一个自己的工具型网站(其实就是夺宝岛抢拍器) 然后因为经常要改动,而且又要放到服务器上进行测试.总是要webpack,然后手动把文件上传上去,不胜其烦,索性搜索了下,直接写个能检测文件变化并自动进行上传的脚本好了. 首先,我们使用npm 安装两个别人封装好的模块. npm install ssh2-sftp-client npm install gaze 第一个模块的作用是sftp上传文件, 第二个模块的作用就是监听文件变化了.当然,你也可以采用node自带f

  • vc++ 监控指定路径下文件变化实现代码

    参考MSDN文档 https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw https://docs.microsoft.com/zh-cn/windows/desktop/api/winnt/ns-winnt-_file_notify_information 具体看代码 # include < iostream > # include < windows.h

  • Python实战之能监控文件变化的神器—看门狗

    一.前言 假设现在有一个应用场景,需要对文件系统进行监控,发生变化时产生日志,对新增的文件做一些相应的操作. 比如说应用到我们之前的音乐高潮提取器:若当前文件夹下增加了一个音乐文件,监控器就调用音乐高潮提取器,自动提取该音乐文件的高潮部分. 这样的监控器写起来也不难,但是很花时间,有许多情况要考虑.不过幸好我们是写Python的,有许多轮子可以使用. 二.准备 开始之前,你要确保Python和pip已经成功安装在电脑上噢. Windows环境下打开Cmd(开始-运行-CMD),苹果系统环境下请打

随机推荐