common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例证》)
common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例子》)
文件监听中有java自带的fileOberver和fileOberverable这两个通过观察者模式进行监听,例如:在主程序中ResolveFileObserver fileObserver = new ResolveFileObserver(PATH);
再复写@Override
public void onEvent(int event, String path)这个方法,通过event参数进行判断。满足条件进行处理例如:
文件监听中有java自带的fileOberver和fileOberverable这两个通过观察者模式进行监听,例如:在主程序中ResolveFileObserver fileObserver = new ResolveFileObserver(PATH);
fileObserver.startWatching();其中ResolveFileObserver 是实现FileObserver类复写startWatching方法,其中startWatching通过堆栈进行实现例如:
@Override public void startWatching() { if (mObservers != null) return; mObservers = new ArrayList<SingleFileObserver>(); Stack<String> stack = new Stack<String>(); stack.push(mPath); while (!stack.isEmpty()) { String parent = stack.pop(); mObservers.add(new SingleFileObserver(parent, mMask)); File path = new File(parent); File[] files = path.listFiles(); if (null == files) continue; for (File f : files) { if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) { stack.push(f.getPath()); } } } for (SingleFileObserver sfo : mObservers) { sfo.startWatching(); } } @Override public void stopWatching() { if (mObservers == null) return; for (SingleFileObserver sfo : mObservers) { sfo.stopWatching(); } mObservers.clear(); mObservers = null; }
再复写@Override
public void onEvent(int event, String path)这个方法,通过event参数进行判断。满足条件进行处理例如:
@Override public void onEvent(int event, String path) { String fileName = path.substring(path.lastIndexOf("/") + 1); switch (event) { case FileObserver.CLOSE_WRITE: if ("条件判断是否成立") //处理相应的逻辑 break; } }
上面的为什么用栈进行监听调用?因为文件监听只能监听其当前目录,子目录是监听不到的,比如/data1/data2.如果你在data1中监听了文件,data2如果变化了是观察不到的,具体的看看代码的实现就明白了。。。
整个监听例子见我其他博客的完整例子。接下来是实现另一个文件监听功能,是common-io-2.0的新功能之文件监控FileAlteration。
在common-io-2.0的新功能初看了下加入了文件监控功能,可能有的时候会遇到。
这部分内容主要有3大类,一个是Monitor类,字面意思就是监控类咯;一个是Observer类,字面意思嘛观察类,用来观察文件的类;一个是listener类,提供各种监听时候的事件处理。
就简单点吧,先看了下这几个类的构造函数,非常简单。那我就继承一下好了:
- package com.zhubin.FileListener;
- import java.io.File;
- import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
- import org.apache.commons.io.monitor.FileAlterationObserver;
- public class FileListenerAdaptor extends FileAlterationListenerAdaptor{
- @Override
- public void onStart(FileAlterationObserver arg0) {
- System.out.println("begin listening!");
- super.onStart(arg0);
- }
- @Override
- public void onStop(FileAlterationObserver arg0) {
- System.out.println("end listening!");
- super.onStop(arg0);
- }
- @Override
- public void onDirectoryCreate(File fold) {
- System.out.println("fold: "+fold.getAbsolutePath()+" is created.");
- super.onDirectoryCreate(fold);
- }
- @Override
- public void onDirectoryChange(File fold) {
- System.out.println("fold: "+fold.getAbsolutePath()+" is changed.");
- super.onDirectoryChange(fold);
- }
- @Override
- public void onDirectoryDelete(File fold) {
- System.out.println("fold: "+fold.getAbsolutePath()+" is deleted.");
- super.onDirectoryDelete(fold);
- }
- @Override
- public void onFileCreate(File file) {
- System.out.println("file: "+file.getAbsolutePath()+" is created.");
- super.onFileCreate(file);
- }
- @Override
- public void onFileChange(File file) {
- System.out.println("file: "+file.getAbsolutePath()+" is changed.");
- super.onFileChange(file);
- }
- @Override
- public void onFileDelete(File file) {
- System.out.println("file: "+file.getAbsolutePath()+" is deleted");
- super.onFileDelete(file);
- }
- }
override一下listener类的各个方法,以便自己处理一些功能。
接下来一个接口实现一下,很简单,见注释:
- package com.zhubin.FileListener;
- import java.io.File;
- import java.io.FileFilter;
- public class FileFilterImpl implements FileFilter {
- /*
- * (non-Javadoc)
- * @see java.io.FileFilter#accept(java.io.File)
- *
- * return true:返回所有目录下所有文件详细(包含所有子目录);return false:返回主目录下所有文件详细(不包含所有子目录)
- */
- public boolean accept(File pathname) {
- System.out.println("file_filter: "+pathname);
- return false;
- }
- }
接下来我们可以测试了:
- package com.zhubin;
- import java.io.File;
- import org.apache.commons.io.monitor.FileAlterationMonitor;
- import org.apache.commons.io.monitor.FileAlterationObserver;
- import com.zhubin.FileListener.FileFilterImpl;
- import com.zhubin.FileListener.FileListenerAdaptor;
- public class Test {
- public static void main(String[] args) {
- try {
- //构造观察类主要提供要观察的文件或目录,当然还有详细信息的filter
- FileAlterationObserver observer = new FileAlterationObserver(new File("J://1"),new FileFilterImpl());
- //构造收听类 没啥好说的
- FileListenerAdaptor listener = new FileListenerAdaptor();
- //为观察对象添加收听对象
- observer.addListener(listener);
- //配置Monitor,第一个参数单位是毫秒,是监听的间隔;第二个参数就是绑定我们之前的观察对象。
- FileAlterationMonitor fileMonitor = new FileAlterationMonitor(5000,new FileAlterationObserver[]{observer});
- //启动开始监听
- fileMonitor.start();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
注:部分代码是前辈的,我直接copy下来,简单易懂。。转载注明出处http://blog.csdn.net/u012083681/article/details/20689381