通过Java SE 7自带的监控服务实现类似.NET FileWatcher的功能 (二)

2014-11-24 01:45:26 · 作者: · 浏览: 1
atch (InterruptedException x) {

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 ev = cast(event);

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 files = new ArrayList<>();

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