高级问题:在 java(或 scala)中是否有一些 API 调用可以让我阻塞,等待创建文件,而不进行轮询?或者是否有与我可以阻止的文件系统相关的任何内容?
一些(基本上不相关的)细节:我有一个进程,我一次运行多个实例,每个实例都完成需要完成的工作列表的一部分。这些实例可能会在不同的时间开始,工作列表可能会在此期间发生变化,而且让进程之间明确地相互通信似乎并不可行*。这些进程之间唯一的通信是通过文件系统。因此,我希望有一种机制可以让其中一个进程识别出另一个进程已经开始(但未完成)当前进程所依赖的一项工作,并阻止,等待另一个进程完成。
* 我真的不想让服务器运行来安排工作;这对我需要的来说太复杂了。而且服务器需要轮询文件系统以获取更新,无论如何,因为要完成的工作列表在文件系统中并且可能随时更改...
最佳答案
从 Java 7 开始就有了 Watchable
(以及包 java.nio.file
中的相关类和接口(interface)),您可以使用它来监视文件系统事件,使用底层操作系统的功能而不是直接轮询这些事件。
例如,您可以使用它来获取在文件系统上创建、删除和修改文件的事件。
要确保第二个进程不会在第一个进程完成写入文件之前获取该文件,您可以让第一个进程先为该文件使用一个临时名称,然后在完成后重命名它。当文件被重命名时,第二个进程可以得到通知。
这是一个例子:
Path path = Paths.get("C:\\Temp");
// Watch for files and directories being created in C:\\Temp
// (also triggers when file is renamed)
WatchService watchService = FileSystems.getDefault().newWatchService();
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
// Wait until an event happens
WatchKey key = watchService.take();
// Look at the events that were signaled on the key
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println(event.kind() + " " + event.context());
}
// Stop receiving events
key.cancel();
关于java - 阻止在 java(或 scala)中创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28617761/