Java 冲洗对象的正确位置
我已经编写了一小段用于打印的代码:Java 冲洗对象的正确位置,java,Java,我已经编写了一小段用于打印的代码: BufferedWriter out = null; try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(FileDescriptor.out), "ASCII"), 512); out.write(msg + '\n');
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;
}
}
obj的冲洗仅在试块中进行。那么,这是一种很好的方法,还是应该在finally块中刷新对象?答案是“视情况而定”。您希望文本什么时候可以阅读?如果您不需要任何文本可供读取(即,没有其他进程正在流上积极等待作为输入),那么您不需要刷新流,直到您完成它(在finally块中)。但是您甚至不需要显式地这样做,因为关闭流会自动刷新它
如果另一个进程正在等待该流,那么您应该在希望该输出可供另一个进程使用时进行刷新。然而,刷新太频繁会否定缓冲的好处
正如其他人所指出的,刷新和关闭流也会引发异常,因此这些操作也应该在它们自己的try/catch块中(静态实用程序方法有助于减少处理流时的样板代码量)。答案是“视情况而定”。您希望文本何时可供阅读?如果您不需要任何文本可供读取(即,没有其他进程正在流上积极等待作为输入),那么您不需要刷新流,直到您完成它(在finally块中)。但是您甚至不需要显式地这样做,因为关闭流会自动刷新它
如果另一个进程正在等待该流,那么您应该在希望该输出可供另一个进程使用时进行刷新。然而,刷新太频繁会否定缓冲的好处
正如其他人所指出的,刷新和关闭流也会引发异常,因此这些操作也应该在它们自己的try/catch块中(静态实用程序方法有助于减少处理流时的样板代码量)。如果可以,请使用现代语法,不要担心所有这些。关闭将自动刷新它,所以只需使用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语法。此代码更短,可读性更强:
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);
}
如果您不熟悉语法,请参阅更多 我通常更喜欢,就在关闭writer/stream之前。我相信有人会对此有更多的了解。使用
out.close()
而不是out=null
out.close()
缺失。你有什么具体的原因吗?我想他错写了out=null
而不是out.close()
没有当你close
一个输出流时,它在未来任何时候都无法写入。但是将null
赋值给out
意味着BufferedWriter
的实例仍然存在,并且能够向输出写入垃圾。我通常更喜欢在关闭writer/流之前。我相信有人会对此有更多的了解。使用out.close()
而不是out=null
out.close()
缺失。你有什么具体的原因吗?我想他错写了out=null
而不是out.close()
没有当你close
一个输出流时,它在未来任何时候都无法写入。但是将null
赋值给out
意味着BufferedWriter
的实例仍然存在,并且能够向输出写入垃圾。是真的需要在try块中刷新还是只能在finally块中完成?关闭将自动刷新。如果使用try/with语法,将为您处理关闭。所以,除非您有理由手动刷新,否则没有必要。是真的需要在try块中刷新,还是只能在finally块中完成?关闭将自动刷新。如果使用try/with语法,将为您处理关闭。因此,除非您有理由手动刷新,否则没有必要。