首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发读写文件

Java并发读写文件
EN

Stack Overflow用户
提问于 2016-08-04 15:17:36
回答 3查看 3.9K关注 0票数 6

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

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

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

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

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

提前感谢

EN

回答 3

Stack Overflow用户

发布于 2016-08-04 15:21:45

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

  • 重命名文件(给它一个带有时间戳的唯一名称)
  • 然后,appender作业将自动重新创建它。
  • 处理您的时间戳文件(不需要删除它们,保持它们的位置,以便您以后可以检查发生了什么)
票数 2
EN

Stack Overflow用户

发布于 2016-08-04 15:21:06

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-08-04 15:29:54

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38771303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档