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,这样就可以看到示例代码了。
Apacha common.io2.0提供了监听文件变化的功能。
功能由三个组件组成。
监听器 FileAlterationListener
用于实现文件改变时触发的行为。
观察者 FileAlterationObserver
用于观察文件的改变,通知注册的监听器执行相应的事件。
监视器 FileAlterationMonitor
通过一线程,每间隔一段时间调用一次注册的观察者检查文件。
maven依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
FileAlterationListener
通过继承FileAlterationListenerAdaptor,覆盖相应事件方法。这里只重写了文件改变。还有其他事件可以查看FileAlterationListener接口看下。
public class FileAlterationReload extends FileAlterationListenerAdaptor { @Override public void onFileChange(File file) { System.out.println("文件改变"); } }
程序实现
public class Demo { public static void main(String[] args) throws Exception { //检查classpath下properties文件夹下的properties文件。 FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(Demo.class.getClassLoader().getResource("properties").getPath(),new PropertiesFileFilter()); FileAlterationListener fileAlterationListener =new FileAlterationReload(); //注册监听器 fileAlterationObserver.addListener(fileAlterationListener); FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor(); //注册观察者 fileAlterationMonitor.addObserver(fileAlterationObserver); //启动监听 fileAlterationMonitor.start(); //让主线程别这么快结束。 Thread.sleep(1000000); } }
修改properties文件夹下的properties文件时,会输出 文件改变。
应用场景
可以用于实现配置文件的热部署
例子:
https://github.com/wujiazhen2/DynamicConfigRefresh
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();
}
}
}
}
