我想使用Java WatchService API(Windows 7 x64,Java 8)监视特定.csv文件的新创建的子文件夹的文件夹。我希望最终的应用程序是这样的:folders \ files将在其他地方创建并加载到云中(例如GDrive)。从那里我将它们与本地文件夹同步(使用股票软件)。这个本地文件夹我想在它们出现后几分钟内监视和处理文件。同样非常重要的是不要错过任何新文件。
我在这里使用WatchService作为许多教程和问题,但它仍然表现得很奇怪。
当创建文件夹(已经包含文件)时,它既是CREATED又是MODIFIED - 因此文件夹有两个事件。我可以忍受它,但它有时会完全错过它中的文件。 (我想,文件复制得如此之快,甚至在注册和监控这个新文件夹之前它们就在那里)。
当我同时复制多个带文件的文件夹(F1,F2,F3)时,它:
寄存器F1,检测F1中的修改文件,处理它们,寄存器F2,寄存器F3
同样,无论如何都无法检测到最后两个文件夹中的文件。
这是我使用的简化代码。我正在寻找这个问题的原因以及如何使其更加健壮。 我可以剪切并粘贴每个新文件夹中的所有文件,希望它能检测到它们,但这是最糟糕的解决方案。
更一般的问题 - ws.take()和ws.pollEvents()和ws.reset()之间会发生什么?当事件没有登记时,是否存在盲目时刻?
public static void main(String args[]) {
// SET UP LOGGER AND CONFIG VARIABLES HERE
// CREATE AN OBJECT AND DEFINE AN ABSTRACT startListening()
WatchServiceClass wsc = new WatchServiceClass() {
public void startListening(WatchService watchService) {
while (true) {
WatchKey queuedKey = watchService.take();
// DOESNT HELP: Thread.sleep(1000);
List<WatchEvent<?>> events = queuedKey.pollEvents();
for (WatchEvent<?> watchEvent : events) {
if (watchEvent.kind() == StandardWatchEventKinds.OVERFLOW) {
continue;
}
String action // create, modify or delete
String fileName // self explanatory
String fullPath
String fullPathParent
if (action.equals("create")) { // TRACK NEW FOLDERS
registerDir(Paths.get(fullPath), watchService);
}
if (new File(fullPath).isDirectory()) {
continue; // NOT DOING ANYTHING WITH DIRECTORIES
}
// IF HERE, THEN THIS IS THE FILE, DO SOMETHING
// TAKES SEVERAL MINUTES
}
if (!queuedKey.reset()) {
keyPathMap.remove(queuedKey);
}
if (keyPathMap.isEmpty()) {
break;
}
}
}
};
// END OF startListening() METHOD DEFINITION
while (true) { // MAIN INFINITE LOOP
try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
wsc.registerDir(Paths.get(DATA_DIR), watchService);
wsc.startListening(watchService);
} catch (Exception e) {
e.printStackTrace();
}
}
}