在写入文件时读取文件

Posted

技术标签:

【中文标题】在写入文件时读取文件【英文标题】:reading a file while it's being written 【发布时间】:2011-09-24 04:37:58 【问题描述】:

我在 *** 上阅读了一些关于此主题的帖子,但我仍然感到困惑。在读取当前正在用 Java 编写的文件时,如何跟踪实际写入的行数,以免得到奇怪的读取结果?

编辑:抱歉,我应该提到写入它的文件是用 C++ 编写的,而读取它的文件是用 Java 编写的,因此变量不能真正轻松共享

【问题讨论】:

【参考方案1】:

读取当前正在用 Java 编写的文件时,如何跟踪实际写入的行数,以免得到奇怪的读取结果?

问题是您永远无法确定文件的当前最后一个字符是行尾。如果它是行终止符,则可以。如果BufferedReader.readLine() 将其解释为没有行终止符的完整行......并且会出现奇怪的结果。

您需要做的是实现自己的行缓冲。当你得到一个 EOF 时,你等到文件增长一些,然后继续读取该行。

或者,如果您使用的是 Java 7 或更高版本,file watcher APIs 允许您在不轮询文件大小的情况下监视文件写入。


顺便说一句,有一个 Apache commons 类是为做这种事情而设计的:

http://commons.apache.org/io/api-2.0/org/apache/commons/io/input/Tailer.html

【讨论】:

【参考方案2】:

如果我理解,该文件是在某个进程中用 C# 编写的,而另一个 Java 进程想要在 正在编写它时读取它。

查看尾部命令here 上的文件监控部分。但是我想警告你,当我最近在 Windows 上使用 cygwin tail 来跟踪滚动的日志文件时,它有时会在重负载下失败。其他实现可能更健壮。

【讨论】:

【参考方案3】:

要计算行数,只需在正在写入的一侧放置一个计数器即可。

所以,每次你写一行,增加一个计数器,并通过一个方法使这个计数器可读,比如public int getNumLinesWritten()

【讨论】:

【参考方案4】:

对我来说显而易见的答案...为什么不使用缓冲区?使用字符串或任何你需要的东西。 (如果需要,您可以使用字符串列表/数组,每行一个?)就像写入文件一样附加到字符串,然后从该字符串中读取而不是从文件中读取。这对你有用吗?

【讨论】:

以上是关于在写入文件时读取文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在文件写入时防止其他人读取/写入文件

在使用 python 写入时从日志文件中读取

读取和写入文件时出错(Java)[关闭]

如何锁定文件并避免在写入时读取

在 C++ 中写入/读取文件

在磁盘上读取/写入文件时如何限制硬盘 I/O?