[英]what are the concern regarding simultaneous read and write to a file?
考虑以下场景:
我的问题是:
在java中有可能:
恶魔
过程一( 作家 ):
...
while(!done){
String nextLine;//process the line
writeLine(nextLine);
...
}
...
过程二( 读者 ):
...
while(hasNextLine()){
String nextLine= readLine();
...
}
...
注意:
作家流程具有优先权。 所以没有什么必须干扰它。
既然您在谈论进程而不是线程 ,那么答案取决于底层操作系统如何管理打开的文件句柄:
open(2)
带有O_RDONLY
标志, lseek(2)
和read(2)
- 已知不会干扰Writer正在调用的系统调用,例如write(2)
。 如果您需要一种方法让两个进程通过文件进行通信,您可以使用一些在读取器和写入器之间传递元信息的额外文件来完成,例如是否有Writer当前正在运行。 将一些结构引入文件也很有用(例如,每个Writer都会向文件追加一个字节,表明正在进行写入过程)。
对于非常快速的非阻塞I / O,您可能需要通过Java的MappedByteBuffer
考虑内存映射文件。
代码不会崩溃。 但是,即使作者仍在写作,读者也会在到达目的地时终止。 你必须以某种方式同步!
关心:
即使您认为另一个编写器线程已更新变量值,您的读者线程也可以读取过时的值
即使你没有同步也写入文件,你会在阅读时看到不同的值
Java File IO和普通文件不是为同时写入和读取而设计的。 要么你的读者超过你的作家,要么你的读者永远不会完成。
JB Nizet在他的评论中提供了答案。 您在阅读时使用BlockingQueue来保存编写器数据。 队列将清空,或者读者永远不会完成。 您可以通过BlockingQueue方法检测这两种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.