Java FileInputStream和FileOutputStream到同一个文件:read()是否保证可以看到所有write()的;“以前发生过吗?”;?

Java FileInputStream和FileOutputStream到同一个文件:read()是否保证可以看到所有write()的;“以前发生过吗?”;?,java,concurrency,stream,Java,Concurrency,Stream,我使用文件作为大数据的缓存。一个线程按顺序写入,另一个线程按顺序读取 假设Java内存模型中存在正确的“之前发生”关系,我是否可以确保(通过write())在一个线程中写入的所有数据都可以从另一个线程中read()?这种行为有记录吗 在我的JDK中,FileOutputStream不重写flush(),并且OutputStream.flush()为空。这就是为什么我想知道 所讨论的流完全由我完全控制的类拥有。每个流保证只能由一个线程访问。我的测试表明它可以按预期工作,但我仍然想知道这是否得到了保

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

假设Java内存模型中存在正确的“之前发生”关系,我是否可以确保(通过
write()
)在一个线程中写入的所有数据都可以从另一个线程中
read()
?这种行为有记录吗

在我的JDK中,
FileOutputStream
不重写
flush()
,并且
OutputStream.flush()
为空。这就是为什么我想知道

所讨论的流完全由我完全控制的类拥有。每个流保证只能由一个线程访问。我的测试表明它可以按预期工作,但我仍然想知道这是否得到了保证和记录

另请参见。

否,您需要刷新()流(至少对于缓冲(输入|输出)流),否则您可能会在缓冲区中有数据


也许您需要一个?

如果FileOutputStream没有覆盖flush(),那么我认为您可以确保通过write()写入的所有数据都可以通过read()读取,除非您的操作系统对数据做了一些奇怪的处理(例如启动一个新线程,等待硬盘以正确的速度旋转,而不是阻塞,等等)因此不会立即写入。

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

FileInputStream
FileOutputStream
on*nix在内部使用读写系统调用。write的文档中说

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

从被读取的文件中的每个字节位置成功读取() 由该写操作修改的数据应返回由write()指定的数据 用于该位置,直到再次修改此类字节位置

我非常肯定windows上的ntfs将具有相同的
read()
write()
保证。

您不能在
FileInputStream
FileOutputStream
对象之间的Java内存模型方面谈论“之前发生”的关系,因为它们不共享任何内存或线程。VM可以根据您的同步要求对其进行自由重新排序。如果在读写之间进行了适当的同步,而没有应用程序级缓冲,则是安全的


但是,
FileInputStream
FileOutputStream
共享一个文件,这就让操作系统决定了在主流系统中,您可以期望在写入后按顺序读取哪些内容。

请参阅我的编辑。请假设写入“发生在”读取之前,并且使用适当的同步原语可以保证这一点。根据您读取文件的方式,可能还会有一些缓冲。。。如果使用BufferedInputStream,则可能会错过更新。在这种情况下,并发数据结构可能会更好…我使用的是纯FileInputStream和FileOutputStream,没有缓冲。显然,是的。但是,这正是这个问题的关键。如果我考虑X =代码>()/代码>和y= <代码>读()(代码)>之前发生的定义,并与(java 5规范中的< 7.4.4和174.5)同步,X和Y之间的内存共享是如何需要的?请详细说明。(添加了线程澄清)如果您在两个不同的线程中有两个不同的对象,VM可以根据您在Java规范中提到的“基本”规则将它们按任意顺序排列。如果想要添加额外的规则,他/她使用了同步机制,但spec.不必说它是包装文件系统操作的对象。我在哪里可以查看
FileInputStream.read()
FileOutputStream.write()
是如何实现的?您可以从这里开始,