簡體   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