阻止在 java(或 scala)中创建文件

Block on file creation in java (or scala)

高级问题:java(或 scala)中是否有一些 API 调用会让我阻塞,等待文件创建,没有轮询?或者有什么与我可以阻止的文件系统相关的东西吗?

一些(基本上不相关的)细节:我有一个过程,我一次 运行 几个实例,每个实例都完成工作列表的一部分需要完成。这些实例可能会在不同的时间开始,工作列表可能会在此期间发生变化,而且让进程之间明确地相互通信似乎并不可行*。这些进程之间唯一的通信是通过文件系统。因此,我希望有一种机制可以让其中一个进程识别另一个进程已经开始(但尚未完成)当前进程所依赖的一项工作,并阻止,等待另一个进程完成。

* 我真的不想让服务器 运行ning 来安排工作;这对我需要的来说太复杂了。无论如何,服务器需要轮询文件系统以获取更新,因为要完成的工作列表在文件系统中并且可能随时更改...

从 Java 7 开始,有 Watchable(以及包 java.nio.file 中的相关 类 和接口),您可以使用它来监视文件系统事件,使用底层操作系统的功能,而不是直接轮询这些事件。

例如,您可以使用它来获取在文件系统上创建、删除和修改文件的事件。

要确保第二个进程不会在第一个进程完成写入文件之前获取该文件,您可以让第一个进程先为该文件使用一个临时名称,然后在完成后重命名它.当文件被重命名时,第二个进程可以得到通知。

这是一个例子:

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();