在Java中隔行扫描BufferedWriter
和PrintWriter
是否安全?考虑以下示例:
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
来编写文本。但是我的问题是:
PrintWriter
和BufferedWriter
是否安全?bufferedWriter.flush()
也会安全吗?BufferedWriter
之后再次使用PrintWriter
也会安全吗?请注意,类似的问题here假定仅访问PrintWriter
,因此无法回答我的问题。
答案 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一起使用,并在其中关闭(或刷新)您的流,以正确释放资源。