工具类commons-io的Tailer用来监控文件
一、前言:在Linux下有使用tail命令
在Commons-io中也提供這種方法
二、他采用的是線程方式來監控文件內容的變化
1、Tailer類(采用線程的方式進行文件的內容變法)
2、TailerListener類
3、TailerListenerAdapter類,該類是集成了TailerListener的實現空的接口方式
三、測試使用代碼
[java]view plaincopy
packagecom.hadoop.leran.commons.io;
importorg.apache.commons.io.FileUtils;
importorg.apache.commons.io.IOUtils;
importorg.apache.commons.io.input.Tailer;
importorg.apache.commons.io.input.TailerListenerAdapter;
importjava.io.File;
publicclassTailerTest{
publicstaticvoidmain(String[]args)throwsException{
TailerTesttailerTest=newTailerTest();
tailerTest.test();
booleanflag=true;
Filefile=newFile("C:/Users/hadoop/Desktop/test/1.txt");
while(flag){
Thread.sleep(1000);
FileUtils.write(file,""+System.currentTimeMillis()+IOUtils.LINE_SEPARATOR,true);
}
}
publicvoidtest()throwsException{
Filefile=newFile("C:/Users/hadoop/Desktop/test/1.txt");
FileUtils.touch(file);
Tailertailer=newTailer(file,newTailerListenerAdapter(){
@Override
publicvoidfileNotFound(){//文件沒有找到
System.out.println("文件沒有找到");
super.fileNotFound();
}
@Override
publicvoidfileRotated(){//文件被外部的輸入流改變
System.out.println("文件rotated");
super.fileRotated();
}
@Override
publicvoidhandle(Stringline){//增加的文件的內容
System.out.println("文件line:"+line);
super.handle(line);
}
@Override
publicvoidhandle(Exceptionex){
ex.printStackTrace();
super.handle(ex);
}
},4000,true);
newThread(tailer).start();
}
}
工具類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
三、讀源代碼的測試代碼
[java]view plaincopy
packagecom.hadoop.leran.commons.io;
importorg.apache.commons.io.FileUtils;
importorg.apache.commons.io.filefilter.FileFilterUtils;
importorg.apache.commons.io.filefilter.IOFileFilter;
importorg.apache.commons.io.monitor.FileAlterationListenerAdaptor;
importorg.apache.commons.io.monitor.FileAlterationMonitor;
importorg.apache.commons.io.monitor.FileAlterationObserver;
importjava.io.File;
importjava.io.FileFilter;
publicclassFileAlterationObserverTest{
publicstaticvoidmain(String[]args)throwsException{
FileAlterationObserverTestfileAlter=newFileAlterationObserverTest();
fileAlter.test();
StringfilePath="C:/Users/hadoop/Desktop/test/";
Filefile=newFile(filePath);
FileUtils.deleteDirectory(file);
file.mkdirs();
//FiletxtFile=newFile(filePath+File.separator+System.currentTimeMillis()+".txt");
//FileUtils.touch(txtFile);
//FiletxtFile=newFile("C:/Users/hadoop/Desktop/test/1401629335839.txt");
//txtFile.deleteOnExit();
//FileUtils.touch(txtFile);
//FilenewFile=newFile(filePath+File.separator+System.currentTimeMillis());
//newFile.mkdirs();
booleanflag=true;
while(flag){
/***測試文件的變化代碼*/
//FilenewFileTxt=newFile(filePath+File.separator+System.currentTimeMillis()+".txt");
//FileUtils.touch(newFileTxt);
//Thread.sleep(2000);
//FileUtils.write(newFileTxt,"1",true);
//Thread.sleep(2000);
//newFileTxt.delete();
/****測試文件夾的變化代碼***/
FilenewFile=newFile(filePath+File.separator+System.currentTimeMillis());
newFile.mkdir();
Thread.sleep(2000);
FilenewFileTxt=newFile(newFile.getAbsolutePath()+File.separator+System.currentTimeMillis()+".txt");
FileUtils.touch(newFileTxt);
}
}
publicvoidtest()throwsException{
StringfilePath="C:/Users/hadoop/Desktop/test/";
FileFilterfilter=FileFilterUtils.and(newMyFileFilter());
FileAlterationObserverfileAlterationObserver=newFileAlterationObserver(filePath,filter);
fileAlterationObserver.addListener(newFileAlterationListenerAdaptor(){
@Override
publicvoidonStart(FileAlterationObserverobserver){
System.out.println("startonfile");
super.onStart(observer);
}
@Override
publicvoidonDirectoryDelete(Filedirectory){
System.out.println("deletefile");
super.onDirectoryDelete(directory);
}
@Override
publicvoidonDirectoryCreate(Filedirectory){
System.out.println("createfile");
super.onDirectoryCreate(directory);
}
@Override
publicvoidonDirectoryChange(Filedirectory){
System.out.println("changefile");
super.onDirectoryChange(directory);
}
@Override
publicvoidonFileCreate(Filefile){
System.out.println("filecreate");
super.onFileCreate(file);
}
@Override
publicvoidonFileDelete(Filefile){
System.out.println("filedelete");
super.onFileDelete(file);
}
@Override
publicvoidonFileChange(Filefile){
System.out.println("filechange");
super.onFileChange(file);
}
});
FileAlterationMonitorfileAlterationMonitor=newFileAlterationMonitor(1000);
fileAlterationMonitor.addObserver(fileAlterationObserver);
fileAlterationMonitor.start();
}
}
/***
*自定義的文件過濾器
*/
classMyFileFilterimplementsIOFileFilter{
@Override
publicbooleanaccept(Filefile){
//Stringextension=FilenameUtils.getExtension(file.getAbsolutePath());
//if(extension!=null&&extension.equals("txt"))
//returntrue;
//returnfalse;
returntrue;
}
@Override
publicbooleanaccept(Filedir,Stringname){
//System.out.println("dir:"+dir+"----->"+name);
returntrue;
}
}
出處:http://blog.csdn.net/xiaoyezi1001/article/details/28095281
總結
以上是生活随笔為你收集整理的工具类commons-io的Tailer用来监控文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIViewContentMode 图
- 下一篇: SQL Server 中 RAISERR