2017-06-01 16 views
0

我在寫一個應用程序,它在文件中每20毫秒記錄一次。由於日誌記錄經常發生,我檢查了該程序的CPU使用情況,並且它相當高。爲了減少這一點,我想緩衝數據,一旦達到一定的大小,然後將數據記錄到文件。這反過來又減少了我必須做的讀寫數量。然而,這是否是一種最佳方法?BufferedWriter日誌寫入使用了大量的CPU

前:

public void log(String log) { 
    BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt", true)); 
    bw.write(log); 
    bw.flush(); 
    bw.close(); 
} 

後:

byte[] outputbArr = log.getBytes(); 

for (int i = 0; i < outputbArr.length; i++) { 
    this.buf[this.bufSize] = outputbArr[i]; 
    this.bufSize++; 
    if (this.bufSize == BUFLENGTH) { 
     writeLog(); 
     this.buf = new byte[BUFLENGTH]; 
     this.bufSize = 0; 
    } 
} 

private void writeLog() { 
    FileOutputStream fos = new FileOutputStream("log.txt"); 
    fos.write(this.buf); 
    fos.close(); 
} 

有沒有更好的方法嗎?我如何減少寫入次數。對於這種情況,通常採用何種方法?

+1

你可以完全拋棄BufferedWriter。你應該看看日誌工具。流行的包括Java自己的java.util.logging庫,log4j,log4j2甚至更好的slf4j。 – Ishnark

+0

使用現代日誌記錄框架 - 查看批處理log4j2的異步日誌記錄:https://logging.apache.org/log4j/2.x/manual/async.html – diginoise

回答

0

我不打開關閉日誌文件。打開追加文件至少與編寫消息本身一樣昂貴。

另外,根據您所需要的可靠性,不明確地刷新日誌寫入器也會加快速度。缺點是,如果最壞的情況最糟糕,如果程序異常終止,日誌中仍然存在於寫入緩衝區中的部分可能會丟失。 shutdownhook可以在許多情況下緩解這種情況,但不是所有情況。

我寧願將FileOutputStream包裝到BufferedOutputStream中,並將其傳遞給OutputStreamWriter。控制BufferedOutputStream的緩衝區大小。通過這種方式,已編碼的輸出就是緩衝的內容,通常(UTF8,ASCII,ISO)使緩衝區有效兩次(每個字符1個字節,每個字符緩衝2個)。