在写入文件时读取文件

时间:2010-12-16 11:21:59

标签: java concurrency io random-access

我必须读取tomcat日志文件,过了一段时间(例如:一小时)我将再次读取该文件(仅用于新添加的内容),所以我创建了RandomAccessFile来记录我完成的最后一个位置,并使用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();

我试过这个(添加条件):

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();

但它不起作用..

任何想法?

2 个答案:

答案 0 :(得分:0)

readLine使用换行符。您不能使用它来确定您是否有完整的行。您需要一次读取一个字节并自行解析该行。

当你获得有效的行时,你也不会移动该位置。

答案 1 :(得分:0)

readLine()剥离EOL字符,因此您看不到它。从你的观点来看,EOF和EOL之间没有区别,这在你的情况下是令人不安的。除了Peter的解决方案之外,您可以尝试在读取该行后检索一个字节并检查它是否为EOL。但是要注意使用的行结束样式。