gpt4 book ai didi

java - 尽管使用了flush(),BufferedWriter仍写入部分行

转载 作者:行者123 更新时间:2023-11-30 08:03:00 25 4
gpt4 key购买 nike

我正在附加到一个简单的日志文件,其中每一行都是一个条目。不幸的是,关闭时通常会出现部分写入的行。代码如下所示:

private val out = java.nio.file.Files.newBufferedWriter(
java.nio.file.Paths.get(file),
java.nio.charset.StandardCharsets.UTF_8,
java.nio.file.StandardOpenOption.APPEND,
java.nio.file.StandardOpenOption.CREATE)

def write(s: String) = synchronized {
out.write(s)
out.newLine()
out.flush()
}

(对 Scala 感到抱歉。)

我不明白为什么文件中会出现部分行。我认为默认的缓冲区大小是 8 kB。条目较短(<500 字节)。每次写入后我都会刷新。

我无法重现部分线路 - 问题发生在客户端。但我几乎可以肯定他们只是向进程发送 SIGTERM 来将其关闭。

SLF4J/LogBack/Log4j 写入的日志文件永远不会有部分行。我究竟做错了什么?我查看了 Apache Commons IO,希望找到一个有保证的基于行的 Writer,但没有。

最佳答案

如果您处理不当,SIGTERM 将会停止您的程序,无论它位于何处。它可能位于flush() 的中间。考虑自己处理 SIGTERM,并在发生这种情况时彻底关闭。

但是请注意,部分线条总是可能出现。您的程序可能会在flush()期间被终止,操作系统可能崩溃或可能发生断电。您的程序应该(在启动时)能够处理不以换行符结尾的日志。

我对你提到的日志编写者没有足够的了解,不知道他们如何避免部分行,也许其他人可以提供比我更好的答案。

关于java - 尽管使用了flush(),BufferedWriter仍写入部分行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com