考虑以下场景:
- 进程 1(Writer)连续向文件 (sharedFile.txt) 追加一行
- 进程 2(Reader)不断从 sharedFile.txt 中读取一行
我的问题是:
在java中是否有可能:
- Reader 进程以某种方式使 Writer 进程崩溃(即中断 Writer 进程)?
- Reader 纯粹根据文件统计信息如何知道何时停止读取文件(Reader 不知道其他人是否正在写入文件)?
证明
流程一(作者):
...
while(!done){
String nextLine;//process the line
writeLine(nextLine);
...
}
...
过程二(读者):
...
while(hasNextLine()){
String nextLine= readLine();
...
}
...
注意:
Writer 进程具有优先权。因此不得有任何干扰。
最佳答案
既然你在谈论进程,而不是线程,答案取决于底层操作系统如何管理打开的文件句柄:
- 在我熟悉的每个操作系统上,Reader 永远不会使编写器进程崩溃,因为 Reader 的文件句柄只允许读取。在 Linux 上,Reader 可能在底层操作系统上调用的系统调用是带有
O_RDONLY
标志的open(2)
,lseek(2)
和read(2)
——已知不会干扰 Writer 正在调用的系统调用,例如write(2)
。 - 在大多数操作系统上,读者很可能不知道何时停止阅读。更准确地说,在某些读取尝试中,它将接收到零作为读取字节数,并将其视为 EOF(文件结尾)。就在此时,可能有Writer准备向文件追加一些数据,但Reader却无从知晓。
如果您需要一种方法让两个进程通过文件进行通信,您可以使用一些额外的文件来实现,这些文件在 Reader 和 Writers 之间传递元信息,例如当前是否有 Writer 在运行。在文件中引入一些结构也很有用(例如,每个 Writer 都会向文件附加一个字节,指示写入过程正在进行)。
对于非常快速的非阻塞 I/O,您可能需要通过 Java 的 MappedByteBuffer
考虑内存映射文件。
关于java - 关于同时读取和写入文件的关注点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31136454/