交错 BufferedWriter 和 PrintWriter
Interlacing BufferedWriter and PrintWriter
在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()
是否也安全?
- 如果安全的话,在我使用
PrintWriter
之后再次使用 BufferedWriter
是否也安全?
请注意,类似的问题 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 一起使用,然后关闭(也许刷新)您的流,以便正确释放您的资源。
在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()
是否也安全? - 如果安全的话,在我使用
PrintWriter
之后再次使用BufferedWriter
是否也安全?
请注意,类似的问题 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 一起使用,然后关闭(也许刷新)您的流,以便正确释放您的资源。