交错 BufferedWriter 和 PrintWriter

Interlacing BufferedWriter and PrintWriter

在Java中交错BufferedWriterPrintWriter安全吗?考虑以下示例:

private void writeToFile(File file, String text, Throwable throwable) throws Exception { // I use the "throws Exception" here for simplicity of the example
    // Write text
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
    bufferedWriter.write(text);
    bufferedWriter.newLine();
    bufferedWriter.flush();

    // Write StackTrace
    PrintWriter printWriter = new PrintWriter(bufferedWriter);
    throwable.printStackTrace(printWriter);
    printWriter.close();
}

我知道我也可以使用 PrintWriter 来编写文本。但我的问题是:

请注意,类似的问题 here 假设只有 PrintWriter 被访问,因此没有回答我的问题。

这样使用 PrintWriter 和 BufferedWriter 安全吗?

如您在 documentation 中所见:

In general, a Writer sends its output immediately to the underlying character or byte stream. Unless prompt output is required, it is advisable to wrap a BufferedWriter around any Writer whose write() operations may be costly, such as FileWriters and OutputStreamWriters.

例如:

 PrintWriter out
   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

如果安全的话,没有bufferedWriter.flush()也是安全的吗?

是的,很安全。 flush() 在您调用它时 刷新流 。恕我直言,根据经验,如果没有自动刷新(并向流中写入更大的数量),您必须在关闭流之前调用它。

同样,来自文档:

public PrintWriter(OutputStream out)

Creates a new PrintWriter, without automatic line flushing, from an existing OutputStream. This convenience constructor creates the necessary intermediate OutputStreamWriter, which will convert characters into bytes using the default character encoding.

因此,如果您使用此构造函数,则应在关闭流之前调用 flush(),如果您使用其他 public PrintWriter(Writer out, boolean autoFlush) 并为自动刷新定义 true,调用我觉得没必要。

如果安全的话,在我使用 PrintWriter 之后再次使用 BufferedWriter 是否也安全?

如果您定义了 FileWriter 用于追加,那将是安全的。现在您将在每次调用函数时覆盖您的文件。 所以我会使用这个构造函数:FileWriter(File file, boolean append) 并且会为 append 指定 true。

有什么不安全的地方:您应该将 try-with-resources 语句与 autoflush 或 try-catch-finally 一起使用,然后关闭(也许刷新)您的流,以便正确释放您的资源。