我正在尝试一个例子
http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml
在示例中BufferReader
未关闭是否需要关闭BufferReader
?请解释一下。
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println (strLine);
}
//Close the input stream
in.close();
答案 0 :(得分:8)
始终关闭溪流。这是一个很好的习惯,可以帮助您避免一些奇怪的行为。调用close()
方法也会调用flush()
,因此您无需手动执行此操作。
关闭流的最佳位置可能是finally
块。如果您在示例中使用它并且在in.close()
行之前发生异常,则不会关闭该流。
如果你有链式流,你只能在它关闭之前关闭最后一个和所有流。这意味着您的示例中为br.close()
- 而不是in.close()
;
示例强>
try {
// do something with streams
} catch (IOException e) {
// process exception - log, wrap into your runtime, whatever you want to...
} finally {
try {
stream.close();
} catch (IOException e) {
// error - log it at least
}
}
或者,您可以在Apache Commons库中使用closeQuietly(java.io.InputStream)。
答案 1 :(得分:5)
从资源泄漏防护的角度来看,如果您还关闭了它包装的流,则不必严格关闭包装器流。但是,关闭包装的流可能会导致内容丢失(特别是在输出情况下),因此最好关闭(仅仅)包装器,并依赖于记录的行为,即关闭包装器也会关闭包装的流。 (对于标准I / O包装类来说,这当然是正确的!)
与亚历山大一样,我质疑依赖“玫瑰印度”例子的智慧。例如,这个有两个更明显的错误,没有一个不太合适的Java程序员应该做的:
未在finally
块中关闭该流。如果在打开和关闭之间抛出任何异常,则不会执行in.close()
语句,并且应用程序将泄漏打开的文件描述符。经常这样做,你的应用程序将开始抛出意外的IOException
s。
链中的DataInputStream没有用处。相反,他们应该使用fstream
作为InputStreamReader
的参数。或者更好的是,使用FileReader
。
最后,这是该示例的更正版本:
BufferedReader br = new BufferedReader(new FileReader ("textfile.txt"));
try {
String line;
while ((line = br.readLine()) != null) {
// Print the content on the console
System.out.println(line);
}
} finally {
// Close the reader stack.
br.close();
}
或使用Java 7的“尝试使用资源”:
try (BufferedReader br = new BufferedReader(new FileReader ("textfile.txt"))) {
String line;
while ((line = br.readLine()) != null) {
// Print the content on the console
System.out.println(line);
}
}
答案 2 :(得分:0)
由于底层流已关闭,因此关闭BufferedReader
并非绝对必要,即使以相反的顺序关闭所有Closeable
是一个好习惯(相对于它们打开的顺序)英寸)