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

标签 java scala file-io

高级问题:在 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/

相关文章:

java - Big-O在java中的简单解释和使用

java - IntelliJ IDEA 14.1.0 变得不可编辑并需要重新启动

c - 无限 do-while 循环,应该寻找 JPEG header

c - 文件解析期间访问违规写入位置

java - Java 8 是否支持本地 lambda 变量?

java - Axis2 ByteArray Web 服务以字符串形式返回

java - 是否可以做一个动态 LLVM 汇编器(来自 Java 等高级语言)?

.net - 写一个 .txt 文件,没有额外的一行?

java - 使用 java 的以下场景的最佳解决方案?

scala - 将稀疏特征向量分解为单独的列