我必须阅读tomcat日志文件,一段时间后(例如:一个小时),我将再次读取该文件(仅适用于新的添加内容),因此我创建了随机访问量,以记录我完成的最后一篇文章,并使用bufferedReader.readline()方法。

但是,我发现有时候我无法读取文件的整行。

例如,tomcat正在编写以下内容(示例):

192.168.0.0 localhost /index.html .....

目前,当我阅读时,我可能会得到结果:

192.168.0 0 localhost /index.html .....

或者

192.168.0.0 localhost /index.html .....

也就是说,如果写这线,我的读者读了一条不完整的行。

因此,我想知道是否有任何想法来决定正在阅读的行?

这是核心代码:

raf = new RandomAccessFile(file, "r");
raf.seek(pos);
while ((line = raf.readLine()) != null) {
    System.out.println(line);
}
pos = raf.getFilePointer();
raf.close();

我已经尝试过(添加contidion):

raf = new RandomAccessFile(file, "r");
raf.seek(pos);
while ((line = raf.readLine()) != null) {
    if(line.chartAt(line.length()-1)=='\n'){
        System.out.println(line);
    } else
        raf.seek(pos); //roll back to the last position

}
pos = raf.getFilePointer();
raf.close();

但是它行不通。

任何想法?

有帮助吗?

解决方案

Readline消耗了Newline字符。您不能使用它来确定您是否有完整的行。您需要一次阅读一个字节并自己解析。

另外,当您获得有效的线路时,您不会在位置上移动。

其他提示

readLine() 条带EOL字符,因此您看不到它。从其案件中,EOF和EOL之间没有区别,这在您的情况下令人不安。除了彼得的解决方案之外,您还可以在阅读行并检查是否是EOL后尝试寻求一个字节。不过,请注意使用的线路结束样式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top