Java输入流的距离有多近?

Java输入流的距离有多近?,java,io,stream,Java,Io,Stream,在以下代码中: DataInputStream in = new DataInputStream( new BufferedInputStream(new FileInputStream(file))); in.close(); 除了关闭“顶级”流之外,我还需要关闭另外两个流吗?如果您查看数据输入流的源代码,您可以看到它也会关闭底层流。所以你不需要。这对所有类型的河流都是(或应该是)正确的。Karazi认为这是正确的。此外,为了了解更多信息,JavaIOAPI实际上是使用d

在以下代码中:

DataInputStream in = new DataInputStream(
          new BufferedInputStream(new FileInputStream(file)));
in.close();

除了关闭“顶级”流之外,我还需要关闭另外两个流吗?

如果您查看
数据输入流的源代码,您可以看到它也会关闭底层流。所以你不需要。这对所有类型的河流都是(或应该是)正确的。

Karazi认为这是正确的。此外,为了了解更多信息,JavaIOAPI实际上是使用decorator模式实现的。您可以在wiki上查看。

我会在finally块中插入close,以确保在出现异常时正确刷新它

public void tryToDoWhatever() throws Exception
{
    DataInputStream in = null;
    try
    {
         in = new DataInputStream(
              new BufferedInputStream(new FileInputStream(file)));
    }
    finally
    { 
        if (in != null)
            in.close();
    }
}

我将利用这个机会回答一个我以前已经回答过的问题

通过使用,您可以让龙目山为您正确关闭溪流。
可以找到详细信息。

更重要的是,它有文档记录。它有点零碎,但是
DataInputStream
继承了
close
来自
FilterInputStream
,它在底层
InputStream
上调用的
close
文档:因此您知道该行为不仅仅是特定实现的副作用。实际上,它适用于所有类型的
Closeable
@Sherwin。。。如果他们正确地执行了“契约”:(是的,你是对的,但这提出了一个新问题:如何处理in.close抛出的IOException??在最后一关加上试接球,或者在上一关向前推?是的,我通常不太希望这样做it@ManuelSelva-我总是将异常处理与业务逻辑分开。我将有一个名为“doWhatever()”的方法,该方法在try/catch块中调用tryToDoWhatever来处理其中的异常。不要从此方法中抛出
Exception
。改为抛出
IOException