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

标签 java file io filewriter

考虑以下场景:

  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/

相关文章:

Java:防止编码字符串的自动解码

java - TransformerHandler 使用大型 xml 文件抛出 OutOfMemoryError

ios - 用于 iOS 开发的 Qt : File read and write

java - 使用 BufferedReader 排队的数据在哪里?

ruby - 我如何获得 PTY.spawn 子退出代码?

java - 批量添加多个联系人

Java Swing JComboBox 删除 LAF

c# - 使用 C# 读取 UNIX 编码的文件

javascript - TypeError 无法设置属性 'size of' 未定义

java - java.io.InputStream.read() 如何工作?