考虑此功能:
import java.io.IOException;
import java.io.Reader;
class StreamPrinter {
void print(Reader reader) throws IOException {
int code = reader.read();
while (code != -1) {
System.out.print((char) code);
code = reader.read();
}
reader.close();
}
}
在出现异常和错误的情况下如何关闭流?
答案 0 :(得分:3)
发布后,您可以使用finally
块,如
void print(Reader reader) throws IOException {
try {
int code = reader.read();
while (code != -1) {
System.out.print((char) code);
code = reader.read();
}
} finally {
reader.close();
}
}
另外,更惯用的写while
循环的方式类似于
void print(Reader reader) throws IOException {
int code;
while ((code = reader.read()) != -1) {
System.out.print((char) code);
}
}
然后使用呼叫者的try-with-resources
;喜欢
try (Reader reader = ...) {
print(reader);
}
答案 1 :(得分:2)
您可以将内容包装在try
和catch
中,以确保关闭流。
这是一个示例:
try {
int code = reader.read();
while (code != -1) {
System.out.print((char) code);
code = reader.read();
}
} finally {
try {
reader.close();
} catch(IOException e) {
// Log here.
}
}
最后的try / catch块允许您关闭阅读器,并在发生异常时对异常进行处理。
答案 2 :(得分:0)
答案 3 :(得分:0)
您应该能够使用Java 7+ try-with-resources ,而无需更改print
方法的API:
import java.io.IOException;
import java.io.Reader;
class StreamPrinter {
void print(Reader readerArg) throws IOException {
try (Reader reader = readerArg /* take ownership of the arg */) {
int code = reader.read();
while (code != -1) {
System.out.print((char) code);
code = reader.read();
}
}
}
}
通常的模式是在资源部分中打开资源。在这种情况下,我们只是分配一个预先存在的资源,以便try
可以拥有所有权。
但是,这不是一个好主意。问题是如果在StreamPrinter::print
调用之前,资源可能会泄漏。因此,Elliott建议重组代码是可取的。