我正在编写一个应用程序,它在文件中每20毫秒记录一次。因为日志记录经常发生,所以我检查了程序的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();
}
有更好的方法吗?如何减少写入次数。对于这样的情况,通常采用什么方法?
答案 0 :(得分:0)
打开后我不会关闭日志文件。打开一个追加文件至少和写一条消息本身一样昂贵。
此外,根据您所需的可靠性,不明确刷新日志编写器也会加快速度。缺点是,如果程序异常终止,如果最坏情况变得最糟,则仍然在写缓冲区中的部分日志可能会丢失。在许多情况下,shutdownhook可以减轻这种情况,但不是所有情况。
我更喜欢将FileOutputStream包装到BufferedOutputStream中,然后将其传递给OutputStreamWriter。控制BufferedOutputStream的缓冲区大小。通过这种方式,已编码的输出是缓冲的,通常(UTF8,ASCII,ISO)使缓冲区的效率提高两倍(每个字符1个字节,而不是每个缓冲的字符2个)。