gpt4 book ai didi

java - 关于同时读取和写入文件的关注点是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:54 26 4
gpt4 key购买 nike

考虑以下场景:

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

我的问题是:

在java中是否有可能:

  1. Reader 进程以某种方式使 Writer 进程崩溃(即中断 Writer 进程)?
  2. Reader 纯粹根据文件统计信息如何知道何时停止读取文件(Reader 不知道其他人是否正在写入文件)?

证明

流程一(作者):

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

过程二(读者):

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

注意:

Writer 进程具有优先权。因此不得有任何干扰。

最佳答案

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

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

如果您需要一种方法让两个进程通过文件进行通信,您可以使用一些额外的文件来实现,这些文件在 Reader 和 Writers 之间传递元信息,例如当前是否有 Writer 在运行。在文件中引入一些结构也很有用(例如,每个 Writer 都会向文件附加一个字节,指示写入过程正在进行)。

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

关于java - 关于同时读取和写入文件的关注点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31136454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com