common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例证》)

common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例子》)
文件监听中有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类,提供各种监听时候的事件处理。

 

就简单点吧,先看了下这几个类的构造函数,非常简单。那我就继承一下好了:

 

Java代码  common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例证》)
  1. package com.zhubin.FileListener;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;  
  6. import org.apache.commons.io.monitor.FileAlterationObserver;  
  7.   
  8. public class FileListenerAdaptor extends FileAlterationListenerAdaptor{  
  9.       
  10.     @Override  
  11.     public void onStart(FileAlterationObserver arg0) {  
  12.         System.out.println("begin listening!");  
  13.         super.onStart(arg0);  
  14.     }  
  15.       
  16.     @Override  
  17.     public void onStop(FileAlterationObserver arg0) {  
  18.         System.out.println("end listening!");  
  19.         super.onStop(arg0);  
  20.     }  
  21.       
  22.     @Override  
  23.     public void onDirectoryCreate(File fold) {  
  24.         System.out.println("fold: "+fold.getAbsolutePath()+" is created.");  
  25.         super.onDirectoryCreate(fold);  
  26.     }  
  27.       
  28.     @Override  
  29.     public void onDirectoryChange(File fold) {  
  30.         System.out.println("fold: "+fold.getAbsolutePath()+" is changed.");  
  31.         super.onDirectoryChange(fold);  
  32.     }  
  33.       
  34.     @Override  
  35.     public void onDirectoryDelete(File fold) {  
  36.         System.out.println("fold: "+fold.getAbsolutePath()+" is deleted.");  
  37.         super.onDirectoryDelete(fold);  
  38.     }  
  39.       
  40.     @Override  
  41.     public void onFileCreate(File file) {  
  42.         System.out.println("file: "+file.getAbsolutePath()+" is created.");  
  43.         super.onFileCreate(file);  
  44.     }  
  45.       
  46.     @Override  
  47.     public void onFileChange(File file) {  
  48.         System.out.println("file: "+file.getAbsolutePath()+" is changed.");  
  49.         super.onFileChange(file);  
  50.     }  
  51.       
  52.     @Override  
  53.     public void onFileDelete(File file) {  
  54.         System.out.println("file: "+file.getAbsolutePath()+" is deleted");  
  55.         super.onFileDelete(file);  
  56.     }  
  57.       
  58. }  

 

override一下listener类的各个方法,以便自己处理一些功能。

 

接下来一个接口实现一下,很简单,见注释:

 

Java代码  common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例证》)
  1. package com.zhubin.FileListener;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileFilter;  
  5.   
  6. public class FileFilterImpl implements FileFilter {  
  7.   
  8.     /*  
  9.      * (non-Javadoc) 
  10.      * @see java.io.FileFilter#accept(java.io.File) 
  11.      *  
  12.      * return true:返回所有目录下所有文件详细(包含所有子目录);return false:返回主目录下所有文件详细(不包含所有子目录) 
  13.      */  
  14.     public boolean accept(File pathname) {  
  15.         System.out.println("file_filter: "+pathname);  
  16.         return false;  
  17.     }  
  18.   
  19. }  

 

接下来我们可以测试了:

 

Java代码  common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例证》)
  1. package com.zhubin;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.commons.io.monitor.FileAlterationMonitor;  
  6. import org.apache.commons.io.monitor.FileAlterationObserver;  
  7.   
  8. import com.zhubin.FileListener.FileFilterImpl;  
  9. import com.zhubin.FileListener.FileListenerAdaptor;  
  10.   
  11. public class Test {  
  12.     public static void main(String[] args) {  
  13.         try {  
  14.             //构造观察类主要提供要观察的文件或目录,当然还有详细信息的filter  
  15.             FileAlterationObserver observer = new FileAlterationObserver(new File("J://1"),new FileFilterImpl());  
  16.             //构造收听类 没啥好说的  
  17.             FileListenerAdaptor listener = new FileListenerAdaptor();  
  18.             //为观察对象添加收听对象  
  19.             observer.addListener(listener);  
  20.             //配置Monitor,第一个参数单位是毫秒,是监听的间隔;第二个参数就是绑定我们之前的观察对象。  
  21.             FileAlterationMonitor fileMonitor = new FileAlterationMonitor(5000,new FileAlterationObserver[]{observer});  
  22.             //启动开始监听  
  23.             fileMonitor.start();  
  24.         } catch (Exception e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28. }  

 

注:部分代码是前辈的,我直接copy下来,简单易懂。。转载注明出处http://blog.csdn.net/u012083681/article/details/20689381