return;
}
for (WatchEvent< > event : signal.pollEvents()) {
Kind< > kind = event.kind();
// TBD - provide example of how OVERFLOW event is handled
if (kind == OVERFLOW) {
continue;
}
// Context for directory entry event is the file name of entry
WatchEvent
Path name = ev.context();
notifiy(name.getFileName().toString(), kind);
}
// 为监控下一个通知做准备
key.reset();
}
}
/**
* 通知外部各个Observer目录有新的事件更新
*/
void notifiy(String fileName, Kind< > kind){
// 标注目录已经被做了更改
setChanged();
// 主动通知各个观察者目标对象状态的变更
// 这里采用的是观察者模式的“推”方式
notifyObservers(new FileSystemEventArgs(fileName, kind));
}
}
3、单元测试
package marvellousworks.practicalpattern.concept.unittest;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import org.junit.Test;
import static java.nio.file.StandardWatchEventKinds.*;
public class DirectoryWatcherFixture {
private static final String DIR_PATH =System.getProperty("user.dir");
private static final File DIR = new File(DIR_PATH);
private static final String SUFFIX = ".txt";
private static final String PREFIX = "test";
private static final int ADD_TIMES = 3;
/**
* 观察者
* @author wangxiang
*
*/
public class Logger implements Observer{
@Override
public void update(Observable observable, Object eventArgs) {
FileSystemEventArgs args = (FileSystemEventArgs) eventArgs;
System.out.printf("%s has been %s\n", args.getFileName(), args.getKind());
assertTrue(args.getFileName().startsWith(PREFIX));
assertEquals(ENTRY_CREATE, args.getKind());
}
}
@Test
public void testWatchFile() throws IOException, InterruptedException{
DirectoryWatcher watcher = new DirectoryWatcher(DIR_PATH);
Logger l1 = new Logger();
watcher.addObserver(l1);
watcher.execute();
// 创建一系列临时文件
List
for(int i=0; i files.add(File.createTempFile(PREFIX, SUFFIX, DIR).toString()); } // 延迟等待后台任务的执行 Thread.sleep(4000); watcher.shutdown(); System.out.println("finished"); } } Console窗口显示的测试内容 test5769907807190550725.txt has been ENTRY_CREATE test4657672246246330348.txt has been ENTRY_CREATE test1823102943601166149.txt has been ENTRY_CREATE finished