java 监听文件或者文件夹变化的几种方式

java 监听文件或者文件夹变化的几种方式

1.log4j的实现的文件内容变化监听

复制代码
package com.jp.filemonitor;
import org.apache.log4j.helpers.FileWatchdog;
public class Log4jWatchdog {
    public static void main(String[] args) {
        GloablConfig gloablConfig = new GloablConfig("D:\\create_lo\\text.txt");
        gloablConfig.setDelay(10000);
        gloablConfig.start();
        while (true) {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
}
public static class GloablConfig extends FileWatchdog{
    protected GloablConfig(String filename) {
        super(filename);
    }

    @Override
    protected void doOnChange() {
        
        System.out.println(filename);
    }
    
}

}

复制代码

2.common-io实现的文件夹变化的监听

这代码网上很多,可以搜索关键字FileAlterationMonitor,FileAlterationObserver  FileAlterationObserver,这样就可以看到示例代码了。

3.nio实现文件夹内容变化的监听

复制代码
package com.jp.filemonitor;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ResourceListener {
private static ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
private WatchService ws;
private String listenerPath;
private ResourceListener(String path) {
try {
ws = FileSystems.getDefault().newWatchService();
this.listenerPath = path;
start();
} catch (IOException e) {
e.printStackTrace();
}
}

private void start() {
    fixedThreadPool.execute(new Listner(ws,this.listenerPath));
}

public static void addListener(String path) throws IOException {
    ResourceListener resourceListener = new ResourceListener(path);
    Path p = Paths.get(path);
    p.register(resourceListener.ws,StandardWatchEventKinds.ENTRY_MODIFY,
        StandardWatchEventKinds.ENTRY_DELETE,
        StandardWatchEventKinds.ENTRY_CREATE);
}


public static void main(String[] args) throws IOException {
    ResourceListener.addListener("F:\\");
    ResourceListener.addListener("d:\\");
}

}

class Listner implements Runnable {
private WatchService service;
private String rootPath;

public Listner(WatchService service,String rootPath) {
    this.service = service;
    this.rootPath = rootPath;
}

public void run() {
    try {
        while(true){
            WatchKey watchKey = service.take();
            List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
            for(WatchEvent<?> event : watchEvents){
            
                //TODO 根据事件类型采取不同的操作。。。。。。。
                System.out.println("["+rootPath+event.context()+"]文件发生了["+event.kind()+"]事件"+    event.count());  
            }
            watchKey.reset();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }finally{
        System.out.println("fdsfsdf");
        try {
            service.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

}

复制代码

 

好文要顶 关注我 收藏该文
xunianchong
关注 - 0
粉丝 - 2
+加关注
0
0
« 上一篇: 2016年国内开源maven镜像站点汇总
» 下一篇: mybatis中GenericTokenParser的用法

posted on 2016-09-02 09:18 xunianchong 阅读(5562) 评论(0) 编辑 收藏

你可能感兴趣的:(JAVA基础)