隔行扫描BufferedWriter和PrintWriter

时间:2018-09-05 08:44:16

标签: java filewriter printwriter bufferedwriter

在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来编写文本。但是我的问题是:

  • 以这种方式使用PrintWriterBufferedWriter是否安全?
  • 如果安全的话,没有bufferedWriter.flush()也会安全吗?
  • 如果安全的话,在我使用BufferedWriter之后再次使用PrintWriter也会安全吗?

请注意,类似的问题here假定仅访问PrintWriter,因此无法回答我的问题。

1 个答案:

答案 0 :(得分:2)

以这种方式使用PrintWriter和BufferedWriter是否安全?

如您在documentation中所见:

  

通常,Writer立即将其输出发送到底层   字符或字节流。除非需要即时输出,否则为   建议将BufferedWriter包装在其write()的所有Writer周围   操作可能很昂贵,例如FileWriters和OutputStreamWriters。

例如:

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

如果安全,没有bufferedWriter.flush()是否也安全?

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

同样,来自文档:

  

公共PrintWriter(OutputStream输出)

     

创建一个新的PrintWriter,   无需从现有OutputStream进行自动行刷新。这个   便利构造函数创建必要的中间   OutputStreamWriter,它将使用以下命令将字符转换为字节   默认字符编码。

因此,如果使用此构造函数,则应在关闭流之前先调用flush(),如果使用其他公共PrintWriter(Writer out,boolean autoFlush)并为true定义true,则我认为该调用是不必要的。 / p>

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

如果您已定义要附加的 FileWriter ,那将是安全的。现在,您将在每次调用函数时覆盖文件。 因此,我将使用以下构造函数:FileWriter(文件文件,布尔值追加),并为追加指定true。

那不是那么安全:您应该将try-with-resources语句与autoflush或try-catch-finally一起使用,并在其中关闭(或刷新)您的流,以正确释放资源。