我已经阅读了有关此主题的stackoverflow上的一些帖子,但我仍然感到困惑。当读取当前用Java编写的文件时,如何跟踪实际写入的行数,以便不会得到奇怪的读取结果?
编辑:对不起,我应该提到编写它的文件是用C ++编写的,读取它的文件是用Java编写的,所以变量不能真正轻易共享答案 0 :(得分:3)
当读取当前用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
答案 1 :(得分:2)
如果我理解,该文件是在某个进程中用C#编写的,而另一个Java进程希望在正在编写时读取它。
查看tail命令here上的文件监控部分。但是我想警告你,当我最近在Windows上使用cygwin尾部来跟踪翻转的日志文件时,它有时会在重负载下失败。其他实现可能更健壮。
答案 2 :(得分:1)
要计算行数,只需在正在写作的一侧保留一个计数器。
因此,每次你写一行,增加一个计数器,并通过一种方法使该计数器可读,如public int getNumLinesWritten()
答案 3 :(得分:0)
对我来说显而易见的答案......为什么不使用缓冲区?使用字符串或任何你需要的。 (如果需要,你可以使用一个列表/数组的字符串,每行可以使用一个?)像写入文件一样附加到字符串,然后从该字符串读取而不是从文件中读取。这对你有用吗?