有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    自Java 7以来,有^{}(以及包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();