<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
public class FileListener extends FileAlterationListenerAdaptor {
@Override
public void onDirectoryCreate(File directory) {
super.onDirectoryCreate(directory);
}
@Override
public void onDirectoryChange(File directory) {
super.onDirectoryChange(directory);
}
@Override
public void onDirectoryDelete(File directory) {
super.onDirectoryDelete(directory);
}
@Override
public void onFileDelete(File file) {
super.onFileDelete(file);
}
}
public interface IFileMonitor {
void startMonitor();
void stopMonitor();
void setListener(FileListener listener);
}
public class FileMonitor implements IFileMonitor {
private FileAlterationMonitor monitor;
private FileAlterationObserver observer;
private FileListener listener;
private long time;
private String path;
public FileMonitor(int seconds, String path){
this.time = seconds;
this.path = path;
}
public void setListener(FileListener listener){
this.listener = listener;
}
public void startMonitor(){
observer = new FileAlterationObserver(path);
observer.addListener(listener);
monitor = new FileAlterationMonitor(TimeUnit.SECONDS.toMillis(time));
monitor.addObserver(observer);
try {
monitor.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void stopMonitor(){
try {
monitor.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 其他
其中关闭monitor需要调用stop方法, 查看源码如下。
默认使用interval设置join时间,并传递中断信号。
使用变量running控制线程退出。
public synchronized void stop() throws Exception {
this.stop(this.interval);
}
public synchronized void stop(long stopInterval) throws Exception {
if(!this.running) {
throw new IllegalStateException("Monitor is not running");
} else {
this.running = false;
try {
this.thread.join(stopInterval);
} catch (InterruptedException var5) {
Thread.currentThread().interrupt();
}
Iterator i$ = this.observers.iterator();
while(i$.hasNext()) {
FileAlterationObserver observer = (FileAlterationObserver)i$.next();
observer.destroy();
}
}
}
- 其他注意点
在同一个monitor周期中,如果快速的删除和恢复同样的文件(属性没有任何变化),并不会触发事件调用。