在写入文件时读取文件
我必须读取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();
我试过这个(添加contidtion):
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使用换行符。 您不能使用它来确定您是否有完整的行。 您需要一次读取一个字节并自行解析该行。
当你得到一个有效的线路时,你也不会移动这个位置。
readLine()
剥离EOL字符,因此您看不到它。 从你的观点来看,EOF和EOL之间没有区别,这在你的情况下是令人不安的。 除了Peter的解决方案之外,您可以尝试在读取该行后检索一个字节并检查它是否为EOL。 但是要注意使用的行结束样式。