Java 读取正在写入的文件-锁定它?

Java 读取正在写入的文件-锁定它?,java,io,Java,Io,有一个文件存储在一个外部服务器上,由供应商非常频繁地更新。我的应用程序每分钟轮询一次此文件,以获取值。我所做的就是读文件 我担心这样做可能会不经意地锁定文件,使其无法由供应商编写。这有可能吗 我已经多次遇到过这个问题,正如Peter Lawrey所说,没有任何可移植的方法可以做到这一点,如果您的环境是Unix,这不应该是一个问题,因为这些并发访问条件是由操作系统正确管理的。然而windows根本不能处理这个问题(是的,这是使用业余操作系统进行生产工作的结果,哈哈) 也就是说,如果您的供应商足够灵

有一个文件存储在一个外部服务器上,由供应商非常频繁地更新。我的应用程序每分钟轮询一次此文件,以获取值。我所做的就是读文件

我担心这样做可能会不经意地锁定文件,使其无法由供应商编写。这有可能吗


我已经多次遇到过这个问题,正如Peter Lawrey所说,没有任何可移植的方法可以做到这一点,如果您的环境是Unix,这不应该是一个问题,因为这些并发访问条件是由操作系统正确管理的。然而windows根本不能处理这个问题(是的,这是使用业余操作系统进行生产工作的结果,哈哈)

也就是说,如果您的供应商足够灵活,有一种方法可以解决这个问题。他们可以写入临时文件,完成后将临时文件移动到最终目标。这样做可以避免您和供应商之间对文件的任何并发访问

另一种方法是精确(困难?)知道供应商更新的时间,避免在某些时间段内读取文件。例如,如果您的供应商每小时更新一次文件,请避免从一小时前的五点读取到一小时后的五点


希望能有所帮助。

进一步了解Eric的答案-您可以检查临时文件的上次修改属性,并在其更改时将其与您的“工作”文件合并-这将保护您避免读/写冲突,并且仅在供应商写入临时文件后才合并文件。尽管这很混乱,而且mrab的评论是正确的,但应该找到更好的解决方案。

有针对卷的服务。这将允许读取备份副本

如果第三方软件也是java的,并且使用了一个记录器,那么这应该是可以调整的:每分钟从10个左右的文件写入下一个文件

我会努力不懈地读取文件(上次读取后进行了修改),直到出现问题。也许你可以在周末或午夜进行数百次的阅读测试,这样不会造成伤害

我的答案:
也许你需要一个本地的监视程序,它会一直等到文件被修改后,再进行快速的监视;之后,允许传输副本。

您如何读取文件?“外部服务器”是指网络?NFS?HTTP?通过使用xpath读取文件。文件是通过网络访问的。写入程序是只追加数据,还是同时更新数据?在第二种情况下,我会尝试找到一个不同的解决方案。你知道编写器在读锁的情况下会如何反应吗?不幸的是,这是操作系统特有的。Windows程序在这方面的行为通常特别不一致。(UNIX通常完全避免这个问题)IMHO,如果您的供应商应用程序的设计不支持这一点,那么他们应该提供一种方法。