监控磁盘文件变化代码

Posted 爱编程的欧巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监控磁盘文件变化代码相关的知识,希望对你有一定的参考价值。

 

//文件监听器

public class FileListener extends FileAlterationListenerAdaptor{
//日志操作
private static final Logger logger = LoggerFactory.getLogger(FileListener.class);
@Override
public void onDirectoryChange(File directory) {
System.out.println("文件目录变更了:"+directory.getAbsolutePath());
//将目录传给文件夹扫描方法
queryData(directory.getAbsolutePath());
}

@Override
public void onDirectoryCreate(File directory) {
System.out.println("文件目录创建了:"+directory.getAbsolutePath());
}

@Override
public void onDirectoryDelete(File directory) {
System.out.println("文件目录删除了:"+directory.getAbsolutePath());
}

@Override
public void onFileChange(File file) {
System.out.println("文件变更了:"+file.getAbsolutePath());
}

@Override
public void onFileCreate(File file) {
System.out.println("文件创建了:"+file.getAbsolutePath());
}

@Override
public void onFileDelete(File file) {
System.out.println("文件删除了:"+file.getAbsolutePath());
}

@Override
public void onStart(FileAlterationObserver observer) {
/* logger.info("文件系统观察者开始检查事件");*/
System.out.println("开始监听:"+observer.getDirectory());
}

@Override
public void onStop(FileAlterationObserver observer) {
/*logger.info("文件系统观察者停止检查事件");*/
System.out.println("停止监听:"+observer.getDirectory());
}

private void queryData(String path){
//扫描出改动路径下数据
ArrayList<String> findFileName = findFileName(path);
//创建cxf服务
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//通过webService服务地址,创建客户端
//String variableWSDL=variableService.selectVariable("WS_WSDLMonitor");
Client client = dcf.createClient(Utils.returnSacnDate);
if(0==findFileName.size()){
findFileName.add("null");//当他为空的时候为了避免传空之报错所以我们在这设置一个null
}
try {
client.invoke("returnScanDate",path,findFileName);
} catch (Exception e) {
e.printStackTrace();
System.out.println("webserver等待时间长,没有响应!");
}
}

// 查找指定目录下的文件
private ArrayList<String> findFileName(String filepath) {
File file = new File(filepath);
ArrayList<String> list = new ArrayList<String>();
if (!file.exists() || !file.isDirectory()) {
System.out.println("目录不存在");
} else {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
if (files[i].getName().endsWith(".jpg")) {
list.add(files[i].getName());
}
}
}
}
return list;
}
}

 

package cn.bocai.pc.FileMonitorMethod;

import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
* 监控类.
*
*/
public class FileMonitor {

FileAlterationMonitor monitor = null;

/**
* 默认8分钟看一次
* @param ob
*/
public FileMonitor(FileAlterationObserver ob){
// this(480000,ob);
this(30000,ob);
}

/**
* 每隔多少时候看一次,观察者
* @param fileName
* @param ob
*/
public FileMonitor(long interval,FileAlterationObserver ob){
monitor = new FileAlterationMonitor(interval,new FileAlterationObserver[]{ob});
}

/**
* 添加观察者
* @param observer
*/
public void addObserver(FileAlterationObserver observer){
monitor.addObserver(observer);
}

/**
* 移除观察者
* @param observer
*/
public void removeObserver(FileAlterationObserver observer){
monitor.removeObserver(observer);
}

/**
* 获取所有观察者
* @return
*/
public Iterable<FileAlterationObserver> getObservers() {
return monitor.getObservers();
}

/**
* 启动监控[observer.initialize()]
*/
public void start(){
try {
monitor.start();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 停止监控[observer.destroy()]
*/
public void stop(){
try {
monitor.stop();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* [不做调用]
* 具体的监控操作:
* observer.checkAndNotify()
*/
private void run(){
monitor.run();
}


}

 

 

 

package cn.bocai.pc.FileMonitorMethod;

import java.io.File;
import java.io.FileFilter;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;

public class FileObserver extends FileAlterationObserver{

private static final long serialVersionUID = 3637219592248717850L;

/**
* 设置观查的文件对象/路径对象
* @param directory
*/
public FileObserver(String directory) {
this(new File(directory),(FileFilter)null);
}

/**
* 设置观查的文件路径,带文件过滤器,比如所有xml文件.
* 这里的IOCase是设置文件比较器(排序).[根据系统,可以不用理会]
* @param directoryName
* @param fileFilter
*/
public FileObserver(File fileName, FileFilter fileFilter){
super(fileName,fileFilter,(IOCase)null);
}

/**
* 监控启动时初始化方法
* 1. 刷新本文件对象
* 2. 得到本文件列表
* 3. 循环初始化File实体
* 4. 设置本文件以及其下的上下级关系
*/
public void initialize() throws Exception {
super.initialize();
}

/**
* 停止监控
* 默认啥都没做
*/
public void destroy() throws Exception {
super.destroy();
}


/**
* 监测文件有没有创建,修改,删除
* 并触发相应监听
* 如果文件名称比原先的大,那么创建一个实体,并调用onDirectoryCreate/onFileCreate
* 如果文件名称比原先的小,那么删除一个实体,并调用onDirectoryDelete/onFileDelete
* 如果文件名称和原告的一样,新的文件与原先的文件进行对比,如果文件属性有改变,并调用onDirectoryChange/onFileChange,循环调用自身,可能是文件夹
* 如果名称长度排在之后,添加文件,并调用onDirectoryCreate/onFileCreate
* 这样就注册了所有文件的监听器
*/
public void checkAndNotify() {
super.checkAndNotify();
}

/**
* 添加监听器
*/
public void addListener(final FileAlterationListener listener) {
super.addListener(listener);
}

/**
* 移除监听器
*/
public void removeListener(final FileAlterationListener listener) {
super.removeListener(listener);
}


/**
* 获取观察者对象的所有监听器
*/
public Iterable<FileAlterationListener> getListeners() {
return super.getListeners();
}

}

 

以上是关于监控磁盘文件变化代码的主要内容,如果未能解决你的问题,请参考以下文章

php 监控文件变化 并上传到服务器

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

mysql数据库数据变化实时监控

mysql数据库数据变化实时监控

inotify高效监控Linux文件系统事件

Linux之watch命令