繁体   English   中英

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

[英]Block on file creation in java (or scala)

高级问题 :java(或scala)中是否有一些API调用会让我阻塞,等待创建文件而不进行轮询? 或者是否有任何与我可以阻止的文件系统相关的内容?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM