ファイルがディレクトリに追加されると、WatchService がファイルを検出し、ファイルがファイル リストに追加されてさらに処理されるアプリケーションがあります。これは私のコードです
public void run() {
/*
* Goes in an infinite loop
*/
while(!finished) {
/*
* Get a watch key, poll() returns a queued key
* if no queued key, this method waits until the specified time.
*/
WatchKey key;
try {
key = watcher.poll(eofDelay,TimeUnit.MILLISECONDS);
} catch (InterruptedException x) {
return;
}
Path dir = keys.get(key);
if (dir == null) {
continue;
}
Path child=null;
/*
* Fetching the list of watch events from
* pollEvents(). There are four possible events
*/
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
/*
* Overflow indicates that events
* might have been lost or discarded
*/
if (kind == OVERFLOW) {
continue;
}
WatchEvent<Path> ev = cast(event);
/*
* Filename is the context of the event
*/
Path name = ev.context();
/*
* Resolves the name of the file to a path
*/
child = dir.resolve(name);
/*
* If directory is created, and watching recursively, then
* register it and its sub-directories
*/
if (nested && (kind == ENTRY_CREATE)) {
try {
if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
registerAll(child);
}
} catch (IOException x) {
}
}
}
File file = child.toFile();
/*
* Only add the file if there is no wild card
* or it matches the specified wild card
*/
if (matcher == null || matcher.matches(file.toPath().getFileName())) {
fileList.add(file);
}
/*
* Key is reset so that it can receive further
* events
*/
boolean valid = key.reset();
if (!valid) {
keys.remove(key);
/*
* If key is no longer valid and empty,
* exit the loop
*/
if (keys.isEmpty()) {
continue;
}
}
}
}
このコードは期待どおりに動作しますが、ファイル内のデータを非常に高速に処理する高性能アプリケーションを設計しています。したがって、ここでの問題は、ファイルの検出にかかる時間の不一致です。たとえば、最初はディレクトリにいくつかのファイルがあり、アプリケーションによって処理されますが、新しいファイルが追加されると、ファイルの検出に 4 ~ 5 秒かかるか、場合によっては 2 秒または 20 ミリ秒かかります。私の eofDelay 値は 10ms です。この矛盾の理由は何ですか?この実装を強化する方法はありますか? または、ディレクトリの変更に利用できる他の効率的なライブラリはありますか? ファイルの検出にかかる時間を最小限にして一貫性を持たせたいのですが、1 秒以上かかると非常にコストがかかります。この点で何か助けていただければ幸いです。:)