繁体   English   中英

有关同时读写文件的问题是什么?

[英]what are the concern regarding simultaneous read and write to a file?

考虑以下场景:

  1. 进程1( Writer )连续向文件追加一行( sharedFile.txt
  2. 进程2( Reader )从sharedFile.txt连续读取一行

我的问题是:

在java中有可能:

  1. 读者进程以某种方式崩溃了Writer进程(即打破了Writer的进程)?
  2. 读者有些怎么知道什么时候停止阅读文件纯粹基于文件统计(读者不知道其他人是否正在写文件)?

恶魔

过程一( 作家 ):

...
while(!done){
 String nextLine;//process the line
 writeLine(nextLine);
 ...
}
...

过程二( 读者 ):

...
while(hasNextLine()){
  String nextLine= readLine();
  ...
}
...

注意:

作家流程具有优先权。 所以没有什么必须干扰它。

既然您在谈论进程而不是线程 ,那么答案取决于底层操作系统如何管理打开的文件句柄:

  1. 在我熟悉的每个操作系统上,Reader永远不会崩溃编写器进程,因为Reader的文件句柄只允许读取。 在Linux上,读取器可以在底层操作系统上调用的系统调用是open(2)带有O_RDONLY标志, lseek(2)read(2) - 已知不会干扰Writer正在调用的系统调用,例如write(2)
  2. 读者很可能不知道何时停止阅读大多数操作系统。 更确切地说,在一些读取尝试中,它将接收零作为读取字节的数量,并将其视为EOF(文件结束)。 在这个时刻,可能有Writer准备将一些数据附加到文件,但Reader无法知道它。

如果您需要一种方法让两个进程通过文件进行通信,您可以使用一些在读取器和写入器之间传递元信息的额外文件来完成,例如是否有Writer当前正在运行。 将一些结构引入文件也很有用(例如,每个Writer都会向文件追加一个字节,表明正在进行写入过程)。

对于非常快速的非阻塞I / O,您可能需要通过Java的MappedByteBuffer考虑内存映射文件。

代码不会崩溃。 但是,即使作者仍在写作,读者也会在到达目的地时终止。 你必须以某种方式同步!

关心:

即使您认为另一个编写器线程已更新变量值,您的读者线程也可以读取过时的值

即使你没有同步也写入文件,你会在阅读时看到不同的值

Java File IO和普通文件不是为同时写入和读取而设计的。 要么你的读者超过你的作家,要么你的读者永远不会完成。

JB Nizet在他的评论中提供了答案。 您在阅读时使用BlockingQueue来保存编写器数据。 队列将清空,或者读者永远不会完成。 您可以通过BlockingQueue方法检测这两种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM