工具类commons-io的Tailer用来监控文件

一、前言:在Linux下有使用tail命令

      在Commons-io中也提供这种方法

二、他采用的是线程方式来监控文件内容的变化

1、Tailer类(采用线程的方式进行文件的内容变法)

2、TailerListener类

3、TailerListenerAdapter类,该类是集成了TailerListener的实现空的接口方式

三、测试使用代码

[java] view plain copy
 

package com.hadoop.leran.commons.io;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.commons.io.IOUtils;  
import org.apache.commons.io.input.Tailer;  
import org.apache.commons.io.input.TailerListenerAdapter;  
  
import java.io.File;  
  
public class TailerTest {  
  
    public static void main(String []args) throws Exception{  
        TailerTest tailerTest = new TailerTest();  
        tailerTest.test();  
        boolean flag = true;  
        File file = new File(“C:/Users/hadoop/Desktop/test/1.txt”);  
  
        while(flag){  
            Thread.sleep(1000);  
            FileUtils.write(file,“”+System.currentTimeMillis()+ IOUtils.LINE_SEPARATOR,true);  
        }  
  
    }  
  
    public void test() throws Exception{  
        File file = new File(“C:/Users/hadoop/Desktop/test/1.txt”);  
        FileUtils.touch(file);  
  
        Tailer tailer = new Tailer(file,new TailerListenerAdapter(){  
  
            @Override  
            public void fileNotFound() {  //文件没有找到  
                System.out.println(“文件没有找到”);  
                super.fileNotFound();  
            }  
  
            @Override  
            public void fileRotated() {  //文件被外部的输入流改变  
                System.out.println(“文件rotated”);  
                super.fileRotated();  
            }  
  
            @Override  
            public void handle(String line) { //增加的文件的内容  
                System.out.println(“文件line:”+line);  
                super.handle(line);  
            }  
  
            @Override  
            public void handle(Exception ex) {  
                ex.printStackTrace();  
                super.handle(ex);  
            }  
  
        },4000,true);  
        new Thread(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 plain copy
 

package com.hadoop.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;  
  
 
public class FileAlterationObserverTest {  
  
    public static void main(String []args) throws Exception{  
  
  
        FileAlterationObserverTest fileAlter = new FileAlterationObserverTest();  
        fileAlter.test();  
        String filePath = “C:/Users/hadoop/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/hadoop/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/hadoop/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;  
    }  
}  

出处:http://blog.csdn.net/xiaoyezi1001/article/details/28095281

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注