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

时间:2015-06-30 11:00:18

标签: java file io filewriter

考虑以下情况:

  1. 流程1( Writer )会不断向文件追加一行( sharedFile.txt
  2. 流程2(读者)不断从 sharedFile.txt
  3. 中读取一行

    我的问题是:

    在java中可能是:

    1. 读者进程以某种方式崩溃了 Writer 进程(即打破了Writer的进程)?
    2. 读者有些人怎么知道何时完全根据文件统计信息停止阅读文件(读者不知道其他人是否正在写文件)?
    3. 恶魔

      处理一个( Writer ):

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

      第二个过程(读者):

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

      注意:

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

4 个答案:

答案 0 :(得分:3)

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

  1. 在我熟悉的每个操作系统上,Reader永远不会崩溃写入程序,因为Reader的文件句柄只允许阅读。在Linux上,读者可以在底层操作系统上调用open(2) O_RDONLY标志,lseek(2)read(2)的系统调用 - 已知不会干扰系统调用Writer正在调用,例如write(2)
  2. 读者很可能不知道何时停止阅读大多数操作系统。更确切地说,在一些读取尝试中,它将接收零作为读取字节的数量,并将其视为EOF(文件结束)。在这个时刻,可能有Writer准备将一些数据附加到文件,但读者无法知道它。
  3. 如果您需要一种方法让两个进程通过文件进行通信,您可以使用一些在读取器和写入器之间传递元信息的额外文件来完成,例如是否有Writer当前正在运行。将一些结构引入文件也很有用(例如,每个Writer都会在文件中附加一个字节,表明正在进行写入过程)。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

关注:

即使您认为另一个作者线程已更新变量值

,您的读者线程也可以读取陈旧值

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

答案 3 :(得分:0)

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

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