![](/img/trans.png)
[英]How to lock a file for read and write to same file using FileInputStream and FileOutputStream
[英]FileInputStream and FileOutputStream to the same file: Is a read() guaranteed to see all write()s that "happened before"?
我正在使用文件作為大數據的緩存。 一個線程按順序寫入它,另一個線程按順序讀取它。
我能否確定在一個線程中寫入(通過write()
)的所有數據都可以從另一個線程read()
,假設在 Java 內存模型方面存在正確的“發生在之前”的關系? 這種行為有記錄嗎?
在我的 JDK 中, FileOutputStream
不會覆蓋flush()
,並且OutputStream.flush()
為空。 這就是為什么我想知道...
有問題的流完全由我完全控制的類擁有。 每個流都保證只能被一個線程訪問。 我的測試表明它按預期工作,但我仍然想知道這是否有保證和記錄。
另請參閱此相關討論。
假設您使用的是 posix 文件系統,那么是的。
*nix 上的FileInputStream
和FileOutputStream
在內部使用讀寫系統調用。 write 的文檔說讀取將看到過去寫入的結果,
在對常規文件的 write() 成功返回后:
從文件中被該寫入修改的每個字節位置的任何成功 read() 都應返回該位置的 write() 指定的數據,直到再次修改此類字節位置。
我很確定 Windows 上的 ntfs 將具有相同的read()
write()
保證。
您不能根據FileInputStream
和FileOutputStream
對象之間的 Java 內存模型談論“發生在之前”的關系,因為它們不共享任何內存或線程。 VM 可以自由地重新排序它們,只是為了滿足您的同步要求。 當您在沒有應用程序級緩沖的情況下在讀取和寫入之間進行適當的同步時,您是安全的。
但是FileInputStream
和FileOutputStream
共享一個文件,這將事情留給操作系統,在主流文件中,您可以按順序讀取后讀取。
不,您需要刷新()流(至少對於緩沖(輸入|輸出)流),否則您可能在緩沖區中有數據。
也許你需要一個並發數據結構?
如果 FileOutputStream 沒有覆蓋flush(),那么我認為您可以確保所有由 write() 寫入的數據都可以由 read() 讀取,除非您的操作系統對數據做了一些奇怪的事情(例如啟動一個等待硬盤驅動器以正確的速度旋轉而不是阻塞等),以便它不會立即寫入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.