我读的一个地方文件中使用的BufferedReader缠FileReader:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

我需要 close()FileReader 以及,或将包装处理呢?我已经看到了代码在哪里的人做事情是这样的:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

这种方法被称为从servlet,我想确保我不会留下任何处理开放。

有帮助吗?

解决方案

没有。

BufferedReader.close()

关闭流 按照如果是的话,为什么不试用一下 BufferedReaderInputStreamReader

以及

FileReader.close()

不。

其他提示

正如其他人所指出的那样,你只需要关闭外包装。

BufferedReader reader = new BufferedReader(new FileReader(fileName));

有一个非常渺茫的机会,这可能泄漏的文件句柄,如果BufferedReader构造抛出异常(例如OutOfMemoryError)。如果您的应用程序是在这种状态下,如何小心你的清理需要为可能取决于是多么的重要,你不要剥夺资源的操作系统,可能要分配给其他程序。

可关闭接口可以用于如果包装的构造是可能在Java 5或6到失败:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

Java 7的代码应使用尝试与 - 资源图案:

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}

据BufferedReader中源,在这种情况下bReader.close通话fReader.close所以理论上讲,你不必调用后者。

的BufferedReader 显示的源代码,该底层是在关闭的BufferedReader关闭。

检查源代码后,我发现,对于示例:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

的关闭()上的方法的的BufferedReader 的对象将调用的阅读器类这将最终调用实现的方法中的的InputStreamReader 类,它然后关闭的 InputStream的的对象。

因此,只有bReader.close()是足够的。

从Java 7开始,你可以使用尝试,与资源的声明

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

由于该BufferedReader实例在try-与资源声明中宣布,将无论try语句是否正常或突然关闭完成。所以,你不需要自己关闭在finally声明。 (这也与嵌套资源语句的情况下)

这是与资源工作recomanded方式,请参见文档获得更详细的信息

您只需要关闭的BufferedReader即reader.close(),它会正常工作。

我来晚了,但是:

BufferReader.java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

你的 不不 需要关闭的包裹读者/作家。

如果你已经采取了一看文档(Reader.close(),Writer.close()),你会看到在 Reader.close() 它说:

关闭流和发布的任何系统的资源与它相关联。

它只是说,它"释放任何系统的资源 关联 它"。即使它并不确认..它给你一个推动开始寻找更深。如果你去 Writer.close() 它只能指出,它关闭本身。

在这种情况下,我们参考 们可根据最新的技术提供一些 看看源代码。

在BufferedWriter 线265 你会看到 out.close().因此,它不关闭本身..这是别的东西。如果你搜索的类出现的"out"你会注意到,在构造在 行87out 是作者的类包装它呼吁另一个构造和再分配 out 参数对它自己的 out 变..

所以..什么其他人?你可以看到类似的代码 BufferedReader线514, BufferedInputStream线468InputStreamReader线199.别人我不知道但是这应该足以假定,他们这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top