[英]what are the concern regarding simultaneous read and write to a file?
考慮以下場景:
我的問題是:
在java中有可能:
惡魔
過程一( 作家 ):
...
while(!done){
String nextLine;//process the line
writeLine(nextLine);
...
}
...
過程二( 讀者 ):
...
while(hasNextLine()){
String nextLine= readLine();
...
}
...
注意:
作家流程具有優先權。 所以沒有什么必須干擾它。
既然您在談論進程而不是線程 ,那么答案取決於底層操作系統如何管理打開的文件句柄:
open(2)
帶有O_RDONLY
標志, lseek(2)
和read(2)
- 已知不會干擾Writer正在調用的系統調用,例如write(2)
。 如果您需要一種方法讓兩個進程通過文件進行通信,您可以使用一些在讀取器和寫入器之間傳遞元信息的額外文件來完成,例如是否有Writer當前正在運行。 將一些結構引入文件也很有用(例如,每個Writer都會向文件追加一個字節,表明正在進行寫入過程)。
對於非常快速的非阻塞I / O,您可能需要通過Java的MappedByteBuffer
考慮內存映射文件。
代碼不會崩潰。 但是,即使作者仍在寫作,讀者也會在到達目的地時終止。 你必須以某種方式同步!
關心:
即使您認為另一個編寫器線程已更新變量值,您的讀者線程也可以讀取過時的值
即使你沒有同步也寫入文件,你會在閱讀時看到不同的值
Java File IO和普通文件不是為同時寫入和讀取而設計的。 要么你的讀者超過你的作家,要么你的讀者永遠不會完成。
JB Nizet在他的評論中提供了答案。 您在閱讀時使用BlockingQueue來保存編寫器數據。 隊列將清空,或者讀者永遠不會完成。 您可以通過BlockingQueue方法檢測這兩種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.