FileInputStream和FileOutputStream到同一个文件:read()是否保证看到"之前发生过"的所有write()?

krl*_*mlr 9 java concurrency stream

我使用文件作为大数据的缓存.一个线程按顺序写入,另一个线程按顺序读取它.

我是否可以确定write()在一个线程中写入的所有数据都可以read()来自另一个线程,假设在Java内存模型方面存在适当的"事先发生"关系?这种行为是否有记录?

在我的JDK中,FileOutputStream不覆盖flush(),并且OutputStream.flush()为空.这就是我想知道的原因......

有问题的流程完全由我完全控制的类所有.保证每个流只能由一个线程访问.我的测试显示它按预期工作,但我仍然想知道这是否有保证和记录.

另见此相关讨论.

sbr*_*ges 11

假设您使用的是posix文件系统,那么是的.

FileInputStream并且FileOutputStream在*nix上内部使用读写系统调用.写文档说,读取将看到过去写入的结果,

在成功返回常规文件的write()之后:

从该写入修改的文件中每个字节位置的任何成功read()都将返回该位置的write()指定的数据,直到再次修改这些字节位置.

我很确定Windows上的ntfs会有相同的read() write()保证.


aus*_*len 5

FileInputStream您不能根据您和对象之间的 Java 内存模型来谈论“发生之前”关系,FileOutputStream因为它们不共享任何内存或线程。VM 可以自由地重新排序它们,只需满足您的同步要求。当您在读取和写入之间实现正确的同步而无需应用程序级缓冲时,您就是安全的。

但是FileInputStreamFileOutputStream共享一个文件,这将事情留给操作系统,在主流操作系统中,您可以在按顺序写入后读取该文件。