你有:
打开文本文件(TEXTFILE)的进程(READER),读取所有行直到EOF并等待出现新行。
READER用Java实现,等待部分使用java.nio.file.WatchService
,如果我在Linux上正确理解使用inotify
。我不确定哪个与问题更相关。
实现非常简单(为了简洁起见,异常处理和一些if
):
WatchService watcher;
watcher = FileSystems.getDefault().newWatchService();
Path logFolder = Paths.get("/p/a/t/h");
logFolder.register(watcher, ENTRY_MODIFY);
reader = Files.newBufferedReader("TEXTFILE", Charset.forName("US-ASCII"));
key = watchService.take();
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
doSomethingWithTheNewLine(reader.readLine());
}
现在,如果我运行READER和
在编辑器中打开TEXTFILE,添加一行并保存,结果是READER似乎没有获得新行
另一方面,如果我在bash
while true; do echo $(date) ; sleep 2; done >> TEXTFILE
然后READER确实得到了新的行
修改 据我所知,这里可能重要的区别在于,在第一种情况下,编辑器加载文件的内容,关闭它(我假设),并在保存时再次打开文件并同步内容与文件系统,而bash行保持文件打开...如何有所作为,我不确定
我想简单的问题是为什么???
我理解这样的情况是,当&gt; 1进程需要同时访问文件系统上的同一文件时,Linux正在使用某种锁定。我还认为当进程 A 在时间t0向文件打开文件描述符时,它会让我们说一个文件内容在t0处的快照。即使进程 A 没有关闭文件描述符(这里似乎就是这种情况),并且进程 B 在某些文件中附加到该文件t0 + delta,然后进程 A 必须重新打开文件描述符才能看到更改,它不能保存到相同的文件描述符并将新数据附加到该文件中...虽然很明显是什么我观察到这种假设是矛盾的......