gpt4 book ai didi

java - 在 Windows 上用 Java 并发写入文件

转载 作者:太空狗 更新时间:2023-10-29 22:39:52 25 4
gpt4 key购买 nike

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

Java API是这样说的:

Some platforms, in particular, allow a file to be opened for writing by only one FileOutputStream (or other file-writing object) at a time.

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

附带问题:

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

最佳答案

当一个文件有另一个写入者时,没有一种可靠的、跨平台的方式来被动通知——即,如果一个文件已经打开以供写入,则引发异常。不过,有几种技术可以帮助您主动检查这一点。

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

如果单个 Java 进程正在处理该文件,您可以使用 Java 内置的并发工具来安全地执行此操作。您需要一个对所有线程都可见的映射,该映射将每个文件名与其对应的锁实例相关联。 a related question的答案可以很容易地适应 File 对象或 canonical paths 来做到这一点到文件。锁定对象可以是 FileOutputStream、流周围的一些包装器或 ReentrantReadWriteLock.

关于java - 在 Windows 上用 Java 并发写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/713550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com