Java实现文件变化监控

网友投稿 219 2023-07-09


Java实现文件变化监控

一. spring配置文件:

application.xml

xmlns:tx="http://springframework.org/schema/tx" xmlns:aop="http://springframework.org/schema/aop"

xmlns:context="http://springframework.org/schema/context" xmlns:dwr="http://directwebremoting.org/schema/spring-dwr"

xmlns:jaxrs="http://cxf.apache.org/jaxrs"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans-3.1.xsd

http://springframework.org/schema/tx http://springframework.org/schema/tx/spring-tx-3.1.xsd

http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop-3.1.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context-3.1.xsd

http://directwebremoting.org/schema/spring-dwr http://directwebremoting.org/schema/spring-dwr-3.0.xsd

http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

class="com.interfaces.file.monitor.FileMonitorImpl">

class="com.interfaces.file.monitor.FileObserverImpl">

class="com.interfaces.file.monitor.FileListener"/>

class="com.interfaces.file.monitor.FileFilterImpl">

xmlns:tx="http://springframework.org/schema/tx" xmlns:aop="http://springframework.org/schema/aop"

xmlns:context="http://springframework.org/schema/context" xmlns:dwr="http://directwebremoting.org/schema/spring-dwr"

xmlns:jaxrs="http://cxf.apache.org/jaxrs"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans-3.1.xsd

http://springframework.org/schema/tx http://springframework.org/schema/tx/spring-tx-3.1.xsd

http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop-3.1.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context-3.1.xsd

http://directwebremoting.org/schema/spring-dwr http://directwebremoting.org/schema/spring-dwr-3.0.xsd

http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

class="com.interfaces.file.monitor.FileMonitorImpl">

class="com.interfaces.file.monitor.FileMonitorImpl">

class="com.interfaces.file.monitor.FileObserverImpl">

class="com.interfaces.file.monitor.FileObserverImpl">

class="com.interfaces.file.monitor.FileListener"/>

class="com.interfaces.file.monitor.FileFilterImpl">

class="com.interfaces.file.monitor.FileListener"/>

class="com.interfaces.file.monitor.FileFilterImpl">

class="com.interfaces.file.monitor.FileFilterImpl">

二. 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

contextConfigLocation

classpath:application.xml

com.web.SpringContextLoaderListener

四. 文件监测器

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

}

/**

* 文件内容改变时执行的动作

*http:///

@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实现文件变化监控,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java Map 按key排序和按Value排序的实现方法
下一篇:浅谈java+内存分配及变量存储位置的区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~