工具類commons-io的檔案監控
一、前言:
使用Commons-io的monitor下的相關類可以處理對檔案進行監控,它採用的是觀察者模式來實現的
1、可以監控資料夾的建立、刪除和修改
2、可以監控檔案的建立、刪除和修改
3、採用的是觀察者模式來實現的
4、採用執行緒去定時去刷現檢測檔案的變化情況
二、程式碼分析
(一)、FileAlterationListener分析,提供了檢測資料夾和檔案的變化回撥函式的介面,觀察模式回撥的介面
1、提供了資料夾的建立、刪除和修改的介面
2、提供了檔案的建立、刪除和修改的介面
(二)、FileAlterationListenerAdaptor實現了FileAlterationListener的介面,只是空的實現,可以根據使用者的使用情況來處理檔案的變化
(三)、FileAlterationObserver重點的觀察者模式的類
1、提供對某路徑下檔案監控
2、使用FileFilter來控制對那些檔案進行監控,在實際的使用情況是使用FileFilterUtils來控制,他設定了新增一系列的FileFilter
3、IOCase可以用來對系統的判斷,使用是Unix和Windows進行不同的處理,Unix支援檔名的大小寫,Windows不區分檔案的大小寫
(四)、FileAlterationMonitor類
1、它繼承了Runnable介面
2、它檢測檔案的過程是採用一個執行緒去不停的進行檔案的檢測
3、精髓之處,檔案的內容的改變處理過程
對於檔案的變化有點不太準確,只是判斷檔名、檔案大小、檔案的修改日期來判斷
( 五)、FileEntry類
1、提供了資料夾和資料夾下檔案的層級結構
2、提供了檔案是否改變了,採用了備忘錄模式(形式上有點,沒有很嚴格的控制),將上一次的狀態進行儲存,在比較的時候重新讀取新的狀態,
比較完後備忘錄重新將新的狀態進行儲存。
(六)、Common-io中提供一序列的檔案的FileFilter類,使用是可以看情況檢視原始碼
1、提供了FileFilterUtils來提供新增一些列的FileFilter
2、新增一序列的FileFilter的實現是使用AndFileFilter來實現的
3、提供相識的OrFileFilter和NotFileFilter
三、讀原始碼的測試程式碼
package com.yezi.leran.commons.io;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
import java.io.FileFilter;
/**
* Created by yezi on 2014/6/1.
*/
public class FileAlterationObserverTest {
public static void main(String []args) throws Exception{
FileAlterationObserverTest fileAlter = new FileAlterationObserverTest();
fileAlter.test();
String filePath = "C:/Users/yezi/Desktop/test/";
File file = new File(filePath);
FileUtils.deleteDirectory(file);
file.mkdirs();
//File txtFile = new File(filePath+File.separator+System.currentTimeMillis()+".txt");
//FileUtils.touch(txtFile);
// File txtFile = new File("C:/Users/yezi/Desktop/test/1401629335839.txt");
// txtFile.deleteOnExit();
// FileUtils.touch(txtFile);
// File newFile = new File(filePath+File.separator+System.currentTimeMillis());
// newFile.mkdirs();
boolean flag = true;
while(flag){
/***測試檔案的變化程式碼*/
// File newFileTxt = new File(filePath+File.separator+System.currentTimeMillis()+".txt");
// FileUtils.touch(newFileTxt);
// Thread.sleep(2000);
// FileUtils.write(newFileTxt,"1",true);
// Thread.sleep(2000);
// newFileTxt.delete();
/****測試資料夾的變化程式碼***/
File newFile = new File(filePath+File.separator+System.currentTimeMillis());
newFile.mkdir();
Thread.sleep(2000);
File newFileTxt = new File(newFile.getAbsolutePath()+File.separator+System.currentTimeMillis()+".txt");
FileUtils.touch(newFileTxt);
}
}
public void test() throws Exception{
String filePath = "C:/Users/yezi/Desktop/test/";
FileFilter filter = FileFilterUtils.and(new MyFileFilter());
FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(filePath,filter);
fileAlterationObserver.addListener(new FileAlterationListenerAdaptor() {
@Override
public void onStart(FileAlterationObserver observer) {
System.out.println("start on file");
super.onStart(observer);
}
@Override
public void onDirectoryDelete(File directory) {
System.out.println("delete file");
super.onDirectoryDelete(directory);
}
@Override
public void onDirectoryCreate(File directory) {
System.out.println("create file");
super.onDirectoryCreate(directory);
}
@Override
public void onDirectoryChange(File directory) {
System.out.println("change file");
super.onDirectoryChange(directory);
}
@Override
public void onFileCreate(File file) {
System.out.println("file create");
super.onFileCreate(file);
}
@Override
public void onFileDelete(File file) {
System.out.println("file delete");
super.onFileDelete(file);
}
@Override
public void onFileChange(File file) {
System.out.println("file change");
super.onFileChange(file);
}
});
FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor(1000);
fileAlterationMonitor.addObserver(fileAlterationObserver);
fileAlterationMonitor.start();
}
}
/***
* 自定義的檔案過濾器
*/
class MyFileFilter implements IOFileFilter {
@Override
public boolean accept(File file) {
// String extension = FilenameUtils.getExtension(file.getAbsolutePath());
// if(extension!=null&&extension.equals("txt"))
// return true;
// return false;
return true;
}
@Override
public boolean accept(File dir, String name) {
//System.out.println("dir:"+dir+"----->"+name);
return true;
}
}
weu