当前位置:  开发笔记 > 编程语言 > 正文

在Windows上用Java编写并发文件

如何解决《在Windows上用Java编写并发文件》经验,为你挑选了1个好方法。

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

在Java的API这样说:

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

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

附带问题:

对于Unix也是如此吗?

因为我希望行为是相同的(实际上我希望一个线程正确编写而另一个线程被警告冲突),我怎样才能确定该文件已经打开进行写入?

erickson.. 16

当文件具有另一个写入器时,没有可靠的跨平台方式被动通知 - 即,如果文件已经打开以进行写入,则引发异常.但是,有几种技术可以帮助您主动检查.

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

如果单个Java进程正在使用该文件,您可以使用Java内置的并发工具来安全地执行它.您需要一个可查看所有线程的映射,该映射将每个文件名与其对应的锁实例相关联.可以使用文件的对象或规范路径轻松调整相关问题的答案.锁定对象可以是流的一些包装器,或者是.FileFileOutputStreamReentrantReadWriteLock



1> erickson..:

当文件具有另一个写入器时,没有可靠的跨平台方式被动通知 - 即,如果文件已经打开以进行写入,则引发异常.但是,有几种技术可以帮助您主动检查.

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

如果单个Java进程正在使用该文件,您可以使用Java内置的并发工具来安全地执行它.您需要一个可查看所有线程的映射,该映射将每个文件名与其对应的锁实例相关联.可以使用文件的对象或规范路径轻松调整相关问题的答案.锁定对象可以是流的一些包装器,或者是.FileFileOutputStreamReentrantReadWriteLock

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有