Java中的并发读/写文件



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

该文件包含许多行,并且该文件每X分钟由一个外部未知应用程序更新一次,该应用程序会向文件添加新行。

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

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

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

提前感谢

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

  • 重命名文件(给它一个带有时间戳的唯一名称)
  • appender作业将自动重新创建它
  • 处理带有时间戳的文件(无需删除它们,将它们保留在适当位置,以便稍后检查发生了什么)

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

除非你知道其他应用程序是如何工作的,否则没有好的解决方案。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新