繁体   English   中英

Java中的并发读/写文件

[英]Concurrent read/write file in Java

我必须从我的Java应用程序中读取一个文本文件。

该文件包含许多行,此文件每隔X分钟从外部未知应用程序更新,该应用程序将新行附加到文件。

我必须从文件中读取所有行,然后我必须删除我刚读过的所有记录。

是否有可能让我逐行读取文件,删除我读取的每一行,同时允许外部应用程序将其他行追加到文件中?

此文件位于Samba共享文件夹中,因此我使用jCIFS来读取/写入文件和BufferedReader Java类。

提前致谢

我不知道你的问题的完美解决方案,但我会以不同的方式解决它:

  • 重命名文件(给它一个带时间戳的唯一名称)
  • 然后,appender作业将自动重新创建它
  • 处理带有时间戳的文件(无需删除它们,将它们保存到位,以便以后查看发生的情况)

问题是我们不知道外部应用程序如何编写和/或重用此文件。 如果在外部应用程序使用计数器正确运行时删除行,则可能会出现问题...

除非您知道其他应用程序的工作原理,否则没有好的解决方案。

是否有可能让我逐行读取文件,删除我读取的每一行,同时允许外部应用程序将其他行追加到文件中?

是的,您可以打开同一个文件,以便从多个进程进行读写。 在Linux中,例如,你会得到两个不同的文件描述符相同的文件。 对于大小为PIPE_BUF的文件写入,或Linux中的4096字节,可以安全地假设操作是原子操作,这意味着内核正在处理锁定和解锁以防止竞争条件。

假设进程A正在写入文件已将其打开为APPEND,那么每次进程A告诉内核write()它将首先寻找文件的大小(文件的结尾)。 这意味着只要在进程A的写操作之间完成,就可以安全地从进程B中删除文件中的数据。只要进程A的写操作不超过PIPE_BUF,Linux就保证它们是原子的,即进程A可以垃圾邮件写入操作,进程B可以不断删除/写入数据,不会产生任何时髦的行为。

Java为您提供了已实现的文件锁 但重要的是要明白它只是“咨询”,而不是“强制性”。 Java不强制执行限制, 两个进程都必须执行检查以查看另一个进程是否持有锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM