【发布时间】:2023-03-16 15:26:01
【问题描述】:
在以下代码中:
DataInputStream in = new DataInputStream(
new BufferedInputStream(new FileInputStream(file)));
in.close();
除了关闭“顶级”流之外,我还需要关闭另外两个流吗?
【问题讨论】:
在以下代码中:
DataInputStream in = new DataInputStream(
new BufferedInputStream(new FileInputStream(file)));
in.close();
除了关闭“顶级”流之外,我还需要关闭另外两个流吗?
【问题讨论】:
如果您查看DataInputStream 的来源,您会发现它也关闭了底层流。所以你不需要。这对于所有类型的流都是(或应该是)正确的。
【讨论】:
DataInputStream 从FilterInputStream 继承了close,其中记录了它在底层InputStream 上调用close:download.oracle.com/javase/6/docs/api/java/io/… 所以你知道这种行为不仅仅是副作用一个特定的实现。
Closeable
我将利用这个机会回答我之前已经做出的答案。
通过使用Project Lombok,您可以让 Lombok 为您正确关闭流。 详情可见here。
【讨论】:
Karazi 的建议是正确的。此外,为了获得一个想法和更深入的了解,Java IO API 实际上是使用装饰器模式实现的。您可以在 wiki 上查看decorator pattern。
【讨论】:
我会将 close 放在 finally 块中,以确保在发生异常时正确刷新它。
public void tryToDoWhatever() throws Exception
{
DataInputStream in = null;
try
{
in = new DataInputStream(
new BufferedInputStream(new FileInputStream(file)));
}
finally
{
if (in != null)
in.close();
}
}
【讨论】:
Exception。改为抛出IOException