Windows环境下Java并发文件写入

Windows环境下Java并发文件写入,java,file-io,portability,concurrency,Java,File Io,Portability,Concurrency,在同一文件上同时打开两个(或更多)FileOutputStreams时会发生什么情况 报告说: 特别是某些平台,一次只允许一个FileOutputStream(或其他文件写入对象)打开一个文件进行写入 我猜Windows不是这样一个平台,因为我有两个线程读取一些大文件(每个都是不同的文件),然后将其写入同一个输出文件。没有引发异常,文件被创建,并且似乎包含来自两个输入文件的块 附带问题: 对于Unix也是这样吗 既然我希望行为相同(实际上我希望一个线程正确写入,另一个线程收到冲突警告),我如何

在同一文件上同时打开两个(或更多)FileOutputStreams时会发生什么情况

报告说:

特别是某些平台,一次只允许一个FileOutputStream(或其他文件写入对象)打开一个文件进行写入

我猜Windows不是这样一个平台,因为我有两个线程读取一些大文件(每个都是不同的文件),然后将其写入同一个输出文件。没有引发异常,文件被创建,并且似乎包含来自两个输入文件的块

附带问题:

  • 对于Unix也是这样吗
  • 既然我希望行为相同(实际上我希望一个线程正确写入,另一个线程收到冲突警告),我如何确定文件已经打开进行写入

我会小心让操作系统为您确定文件状态(因为这取决于操作系统)。如果你有一个共享资源,我会使用

使用此锁意味着一个线程可以获取资源(文件)并对其进行写入。下一个线程可以检查该锁是否被另一个线程持有,和/或无限期阻塞,直到第一个线程释放它


我认为Windows会限制两个进程写入同一个文件。我不相信Unix也会这样做。

如果您所说的两个线程在同一个JVM中,那么您可能会在某个地方有一个布尔变量,这两个线程都可以访问。

当一个文件有另一个写入程序时,没有一种可靠的跨平台方式可以被动地得到通知,即。,如果文件已打开进行写入,则引发异常。不过,有几种技术可以帮助您主动检查这一点

如果多个进程(可以是Java和非Java的混合)可能正在使用该文件,请使用。成功使用文件锁的关键是要记住它们只是“建议性的”。如果您检查锁,它保证是可见的,但是如果您忘记了,它不会阻止您对文件执行操作。所有访问文件的进程都应设计为使用锁定协议


如果单个Java进程正在处理该文件,则可以使用Java中内置的并发工具来安全地处理该文件。您需要一个对所有线程可见的映射,该映射将每个文件名与其对应的锁实例相关联。对的答案可以很容易地进行调整,以便使用
文件
对象或文件执行此操作。lock对象可以是
FileOutputStream
、流周围的一些包装器,或者Unix允许并发写入同一文件


您不应该尝试多次写入同一文件。如果你是,你有一个设计缺陷。

但是我不想在我写的时候阻止,我想阻止,如果有人已经在写我想写的文件。事实上,我根本不想阻止。我想告诉第二个线程他不能写,让客户端决定进一步的操作。您将能够检查锁,以确定是否有其他人已将其锁定(即未锁定),然后决定如何操作