2010-12-16 81 views
1

我必須讀取tomcat日誌文件,並且經過一段時間(例如:一個小時)後,我將再次讀取該文件(僅用於新添加的內容),因此我創建了RandomAccessFile記錄我完成的最後一個位置,並使用BufferedReader.readLine()方法。正在寫入文件時正在讀取文件

但是,我發現有時我無法讀取文件的整個行。

例如,Tomcat是特林中寫入以下內容(例如只):

192.168.0.0本地主機/index.html .....

而且在這一刻,當我讀我可能得到的結果:

192.168.0 0本地主機/index.html .....

192.168.0.0本地主機/index.html .....

這就是說,我的讀者閱讀uncomplete行,如果該行被寫入。

所以我想知道任何想法來決定正在閱讀的行是否已完成?

這是核心代碼:

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

但它不工作..

什麼想法?

+0

也許總是跳過最後一行? – dagge 2010-12-16 11:56:18

回答

0

readLine消耗換行符。你不能用它來確定你是否有完整的一行。您需要一次讀取一個字節並自行解析該行。

而且你是不是在位置移動時,你會得到一個有效的行..

+0

字節b; ((b = raf.readByte())!= -1){ //如何檢查這個字節是否爲EOL? } – hguser 2010-12-17 00:10:14

+0

另外,我從readByte()得到了一個字節,但行分隔符是一個字符串:system.getProperty(「line.separator」);如何比較它們? – hguser 2010-12-17 00:14:39

+0

@hguser,你不應該假設你的輸入新行符合系統默認值。相反,您應該允許\ r,\ n或\ r \ n – 2010-12-17 07:52:48

0

readLine()條EOL字符,這樣你就不會看到它。 EOF和EOL之間沒有什麼區別,從你的觀點來看這很麻煩。除了Peter的解決方案之外,您可以在閱讀該行後嘗試查找一個字節,並檢查是否爲EOL。不過,要小心使用的線條結束風格。