我写了一小段代码用于打印:
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(FileDescriptor.out), "ASCII"), 512);
out.write(msg + '\n');
out.flush();
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException(
"Test failed ",
e);
} catch (IOException e) {
throw new IllegalStateException(
"Test failed", e);
} finally {
if (out != null) {
out = null;
}
}
仅在try块中刷新obj。那么它是一个很好的方法,或者我应该刷新finally块中的对象吗?
答案 0 :(得分:4)
如果可以,请使用现代语法并且不要担心所有这些。关闭将自动刷新它,因此只需使用try-with-resources语法。此代码更短,更易读:
try(BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(FileDescriptor.out), "ASCII"), 512)) {
out.write(msg + '\n');
} catch (UnsupportedEncodingException | IOException e) {
logger.info("Test failed due to exception.");
throw new IllegalStateException("Test failed", e);
}
如果您不熟悉语法,请详细了解try-with-resources。
答案 1 :(得分:1)
答案是“这取决于”。您何时希望文本可供阅读?如果您不需要任何可用于读取的文本(即没有其他进程在流上主动等待作为输入),那么在完成之前您不需要刷新流(在最后阻止)。但是你甚至不需要明确地这样做,因为关闭流会自动刷新它。
如果另一个进程正在等待流,那么只要您希望该输出可用于其他进程,就应该刷新。然而,刷新往往否定了缓冲的好处。
正如其他人所说,刷新和关闭流也会引发异常,因此这些操作也应该在他们自己的try / catch块中(静态实用程序方法可以帮助减少使用时的样板代码量)流)。