Java 对OutputStream调用close()会切断日志文件的输出
我正在调查Java 对OutputStream调用close()会切断日志文件的输出,java,io,stream,Java,Io,Stream,我正在调查.close()导致中断问题的问题。该程序运行在两个不同的服务器上,但存在相同的中断问题。日志文件似乎没有正确刷新。所以我决定深入研究.close()源代码。我没有看到调用.flush()。我错过什么了吗?我们是否应该始终调用.flush()?根据这个答案,这不重要: 我要说的是: private static void write_to_file(String incoming){ output_stream.write(incoming); output_s
.close()
导致中断问题的问题。该程序运行在两个不同的服务器上,但存在相同的中断问题。日志文件似乎没有正确刷新。所以我决定深入研究.close()
源代码。我没有看到调用.flush()
。我错过什么了吗?我们是否应该始终调用.flush()
?根据这个答案,这不重要:
我要说的是:
private static void write_to_file(String incoming){
output_stream.write(incoming);
output_stream.write(System.lineSeparator());
}
稍后我调用output_stream.close()代码>
源代码:
/**
* Closes the stream and releases any system resources associated
* with it. Closing a previously closed stream has no effect.
*
* @see #checkError()
*/
public void close() {
try {
synchronized (lock) {
if (out == null)
return;
out.close();
out = null;
}
}
catch (IOException x) {
trouble = true;
}
}
日志文件:
正如您已经正确指出的,在流上调用close()
就足以刷新写入流的内容。如果输出被截断,则存在一些常见的陷阱:
- 您的
close()
方法不会被调用,例如,如果您将其放入catch
块而不是finally
;)
- 对自定义流调用
close()
,不会将调用传播到底层流
- 如果您没有正确地将字符串转换为字节,那么问题也可能出现在编码中
使用close()。如何创建要写入的流?你绝对确定你的close()
方法被调用了吗?你知道吗,我刚刚检查了一下,发现它只在try-catch块中执行(在任何异常情况下)。请留下一个答案,我会打正确的。谢谢
C:\apps\bot\log\processed\file.0000090.gz
C:\apps\bot\log\processed\file.0000091.gz
C:\apps\bot\log\process