读取另一个进程正在写入的文件

时间:2014-09-24 19:17:46

标签: java

我有一个由另一个进程(完全不同的pid)写入的文件。我知道它是逐行写入文件的。

从Java开始,我想逐行读取这个文件,因为正在写入这些行。 (或尽可能接近)。

不是重新发明轮子......在Java中已经有了一种常见的方法来实现这一点吗?有一个名为.readLine()的阻塞函数会很好。

1 个答案:

答案 0 :(得分:1)

您可以使用WatchService来观察操作系统中的事件。

我更喜欢使用take方法的选项,因为它会阻止您的系统不必要地轮询并等待操作系统中的事件。

我已经在Windows,Linux和OSX上成功使用过它 - 只要 Java 7 可用,因为这是自JDK 1.7以来的新功能。

这是我提出的解决方案 - 运行在与主线程不同的线程中,因为我不想阻止我的UI - 但这取决于您和您的应用程序架构。

boolean run = true;
WatchService watchService = FileSystems.getDefault().newWatchService();
Path watchingPath = Paths.get("path/to/your/directory/to/watch");
watchingPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

WatchKey key = null;
while(run && !isCancelled()) {
    try {
        key = watchService.take();
        for(WatchEvent<?> event : key.pollEvents()) {
            if(!isCancelled()) {
                if(event.context().toString().equals(fileName)) {
                    //Your file has changed, do something interesting with it.
                }
            }
        }
    } catch (InterruptedException e) {
        //Failed to watch for result file cahnges
        //you might want to log this.
        run = false;
    } catch (ClosedWatchServiceException e1) {
        run = false;
    }

    boolean reset = key.reset();
    if(!reset) {
        run = false;
    }
}

另请参阅