此文章是基于  搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

一. 相关文件介绍

  1. applicationInterface.xml,spring配置文件,可设置监测的文件夹、扫描时间、指定监控哪些扩展名的文件

<?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"
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"> <!-- 文件监测器 -->
<bean id="monitor"
class="com.ims.interfaces.file.monitor.FileMonitorImpl"> <constructor-arg index="0" value="10000" /> <!-- 监测时间间隔,单位:毫秒 -->
<constructor-arg index="1" ref="observer" /> <!-- 文件观察器 -->
</bean> <!-- 文件观察器 -->
<bean id="observer"
class="com.ims.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.ims.interfaces.file.monitor.FileListener"/> <!-- 文件过滤器 -->
<bean id="filter"
class="com.ims.interfaces.file.monitor.FileFilterImpl">
<!--
指定文件扩展名,只有指定的扩展名文件会被处理。
不同的扩展名间以 "," 间隔,如:xml,txt,bak
-->
<constructor-arg index="0" value="xml"/>
</bean>
</beans>

  2. SpringContextLoaderListener.java,spring上下文加载监听器,服务运行时启动扫描,结束时关闭扫描

package com.ims.web;

import javax.servlet.ServletContextEvent;

import org.springframework.web.context.ContextLoaderListener;

import com.ims.interfaces.file.monitor.FileMonitor;

/**
* Spring场景加载监听器,用于加载/销毁Spring场景
*/
public class SpringContextLoaderListener extends ContextLoaderListener { public SpringContextLoaderListener() {
super();
} @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);
} }

  3. web.xml,web工程配置文件

    如果存在如下代码,则去掉

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

    然后添加上如下代码:

<listener>
<listener-class>com.ims.web.SpringContextLoaderListener</listener-class>
</listener>

  4. 文件监测器

    4.1. 接口:FileMonitor.java

package com.ims.interfaces.file.monitor;

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(); }

    4.2. 实现类:FileMonitorImpl.java

package com.ims.interfaces.file.monitor;

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();
} }

  5. 文件观察器

    5.1. 接口:FileObserver.java

package com.ims.interfaces.file.monitor;

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();
}

    5.2. 实现类:FileObserverImpl.java

package com.ims.interfaces.file.monitor;

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;
}
}

  6. 文件监听器:FileListener.java

package com.ims.interfaces.file.monitor;

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
System.out.println("Create file: "+file.getName());
} /**
* 文件删除(转移)时执行的动作
*/
@Override
public void onFileDelete(File file) {
// To do something
System.out.println("Delete file: "+file.getName());
} /**
* 文件内容改变时执行的动作
*/
@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
}
}

  7. 文件过滤器

    7.1. 接口:FileFilter.java

package com.ims.interfaces.file.monitor;

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

      7.2. 实现类:FileFilterImpl.java

package com.ims.interfaces.file.monitor;

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;
} }

二. 测试

  在 "D:\UploadDir" 目录下,新建或删除xml格式的文件,FileListener.java 会在后台打印出文件的名字

java实现文件变化监控的更多相关文章

  1. python中文件变化监控-watchdog

    在python中文件监控主要有两个库,一个是pyinotify ( https://github.com/seb-m/pyinotify/wiki ),一个是watchdog(http://pytho ...

  2. java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

    首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名. 一. 一开 ...

  3. java实现文件监控

    文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...

  4. Java文件实时监控Commons-io

    今天看到一网友写的 Java 文件监控,实时监控文件加载 ,突然想到Commons-io中已有此功能的实现,先温习下 写个简单的Demo: 有三种方式: 1.java common.io    内部实 ...

  5. Java高级应用(一个)-文件夹监控服务

    最近.在研究一些比较成熟的框架.他们还发现,他们中的一些相当不错的文章.现在,对于一些在你们中间一个简单的翻译(版的英文文章,非常有帮助). 译:原文链接 你有没有发现,当你编辑一个文件.同一时候使用 ...

  6. Java实现文件夹下文件实时监控

    一.commons-io方法 1.使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的创建.删除和修改 (2)可以监控文件的创 ...

  7. 使用apache common-io 监控文件变化--转

    package common.io; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.common ...

  8. C#监控指定目录的文件变化的代码

    如下的资料是关于C#监控指定目录的文件变化的代码. FileSystemWatcher watcher = new FileSystemWatcher();watcher.Path = @" ...

  9. JDK 之 NIO 2 WatchService、WatchKey(监控文件变化)

    JDK 之 NIO 2 WatchService.WatchKey(监控文件变化) JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html ...

随机推荐

  1. 【JS】heatmap.js v1.0 到 v2.0,详细总结一下:)

    前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这 ...

  2. 艾伦 Visual Studio 批量自动化代码操作工具-VS插件发布

    艾伦 Visual Studio 批量自动化代码操作工具 以下简称--艾伦工具箱. 艾伦工具箱是一个多文件批量处理插件,目的是为了广大开发者提高开发效率,减少项目代码规范化审计,缩短开发者的项目开发周 ...

  3. Winform开发框架之肖像显示保存控件的实现

    我们在开发一些Winform程序的时候,除了常规的显示普通数据外,有的时候需要显示一些人员肖像或者一些车辆等物体的图片,一般这些内容较小,所以以二进制存储在数据库是一个不错的方案.但由于它们虽然很常用 ...

  4. 面积(area)

    题目描述 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中点的数目.如图所示,在10*10的二维数组中,“*”围住了15个点,因此面积为15. 0 ...

  5. 使用jenkins配置.net mvc网站进行持续集成二

    上一篇使用jenkins配置.net mvc网站进行持续集成一只是简单介绍了jenkins构建站点到本地服务器,这一篇,就来讲解如何部署站点到指定的服务器上面. 1.IIS远程发布配置 1.在服务器管 ...

  6. 基于highcharts封装的组件-demo&源码

    前段时间做的项目中需要用到highcharts绘制各种图表,其实绘制图表本身代码很简单,但是由于需求很多,有大量的图形需要绘制,所以就不得不复制粘贴大量重复(默认配置等等)的代码,所以,后来抽空自己基 ...

  7. Html + Css思维导图

    最近整理的一份Html和Css的思维导图,共享给初学者使用. 各个知识点的详细案例介绍,后期会分阶段依次发布,希望对大家学习html和css有帮助. 如果对文中的知识点有异议,欢迎随时拍砖! 后期也回 ...

  8. HTML5进阶段内联标签汇总(小篇)

    内联元素,与别人公用一行,但是设置宽高无效.其特点: ①和其他元素都在一行上: ②高,行高及外边距和内边距不可改变: ③宽度就是它的文字或图片的宽度,不可改变 ④内联元素只能容纳文本或者其他内联元素 ...

  9. 实现UITextView的placeholder

    我们知道在iOS开发时,控件UITextField有个placeholder属性,UITextField和UITextView使用方法基本类似,有两个小区别:1.UITextField单行输入,而UI ...

  10. iOS多线程简介

    1.进程 什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开迅雷.Xcode,系统就会分别启动2个进程 2.线程 什么是 ...