关闭缓冲读取器是强制性的

时间:2012-02-21 10:47:00

标签: java

我正在尝试一个例子 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();

3 个答案:

答案 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是一个好习惯(相对于它们打开的顺序)英寸)