我有一个由另一个进程(完全不同的pid)写入的文件。我知道它是逐行写入文件的。
从Java开始,我想逐行读取这个文件,因为正在写入这些行。 (或尽可能接近)。
不是重新发明轮子......在Java中已经有了一种常见的方法来实现这一点吗?有一个名为.readLine()
的阻塞函数会很好。
答案 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;
}
}