在写入文件时读取文件
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】:对我来说显而易见的答案...为什么不使用缓冲区?使用字符串或任何你需要的东西。 (如果需要,您可以使用字符串列表/数组,每行一个?)就像写入文件一样附加到字符串,然后从该字符串中读取而不是从文件中读取。这对你有用吗?
【讨论】:
以上是关于在写入文件时读取文件的主要内容,如果未能解决你的问题,请参考以下文章