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