Javaでの変更についてフォルダーを監視するための以下のコードがあります。
public class FolderWatcher
{
// public List<Event> events = new ArrayList<Event>();
public static Event call() throws IOException, InterruptedException
{
LOG.info("Watching folder");
Path _directotyToWatch = Paths.get("data/input-files"); // this will be put in the configuration file
WatchService watcherSvc = FileSystems.getDefault().newWatchService();
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
watchKey = watcherSvc.take();
for (WatchEvent<?> event : watchKey.pollEvents())
{
WatchEvent<Path> watchEvent = castEvent(event);
LOG.info(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context()));
String eventName = event.kind().name();
String fileName = _directotyToWatch.resolve(watchEvent.context()).toString();
watchKey.reset();
return new Event(eventName, fileName);
}
return null;
}
@SuppressWarnings("unchecked")
static <T> WatchEvent<T> castEvent(WatchEvent<?> event)
{
return (WatchEvent<T>) event;
}
}
と:
public abstract class AbstractWatcher
{
abstract void eventDetected(Event event);
private final ScheduledExecutorService threadpool;
public AbstractWatcher(ScheduledExecutorService threadpool)
{
this.threadpool = threadpool;
}
public AbstractWatcher()
{
threadpool = Executors.newSingleThreadScheduledExecutor();
}
public void handle()
{
final FolderWatcherHandler handler = new FolderWatcherHandler();
final Runnable r = new Runnable()
{
@Override
public void run()
{
try
{
Event event = FolderWatcher.call();
if (event != null)
{
handler.eventDetected(event);
}
}
catch (IOException e)
{
LOG.error("failed to watch the update", e);
}
catch (InterruptedException e)
{
LOG.info("thread interrupted", e);
Thread.currentThread().interrupt();
return;
}
}
};
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
threadpool.shutdown();
}
});
threadpool.scheduleWithFixedDelay(r, 0, 1, TimeUnit.NANOSECONDS);
}
}
と:
public class FolderWatcherHandler extends AbstractWatcher
{
@Override
public void eventDetected(Event event)
{
// Do stuff
}
}
ファイルの変更(私の場合はほとんど追加)が1つずつ行われ、追加ごとにわずかな遅延がある限り、このすべてが完璧に機能します。ただし、複数のファイルを同時にドラッグ アンド ドロップまたは追加すると、. このコードは、最初のファイルのイベントのみを検出し、残りのファイルは検出しません。実行時間をナノ秒単位で入力しましたが、役に立ちませんでした。このコード全体がこれを行う正しい方法であることに疑問を抱いています。誰かが私を助けることができますか?ありがとう。