Java输入流有多接近?

7
在以下代码中:
DataInputStream in = new DataInputStream(
          new BufferedInputStream(new FileInputStream(file)));
in.close();

除了关闭“顶层”流之外,我需要关闭其他两个流吗?

4个回答

8
如果你查看 DataInputStream 源码,你会发现它也关闭了底层流,所以你不需要再次关闭。并且对于所有类型的流来说,这都是正确的(或应该是正确的)。

3
更重要的是,这已经有文档记录了。尽管有些零散,但 DataInputStream 继承自 FilterInputStream,而 FilterInputStream 的文档说明它会调用底层 InputStream 上的 close 方法:http://download.oracle.com/javase/6/docs/api/java/io/FilterInputStream.html 因此,您可以知道该行为不仅仅是特定实现的副作用。 - T.J. Crowder
实际上,这对所有类型的“Closeable”都是正确的。 - Shervin Asgari
2
@Sherwin...前提是他们正确地实现了“合同” :-) - Stephen C

3

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

通过使用Project Lombok,你可以让Lombok为你正确关闭流。详情请参见此处


1
我会把关闭操作放在 finally 块中,以确保在出现异常的情况下它被正确地刷新。
public void tryToDoWhatever() throws Exception
{
    DataInputStream in = null;
    try
    {
         in = new DataInputStream(
              new BufferedInputStream(new FileInputStream(file)));
    }
    finally
    { 
        if (in != null)
            in.close();
    }
}

是的,你说得对,但这引出了一个新问题:如何处理可能由 in.close 抛出的 IOException?在 finally 块中添加 try catch 还是将其转发到上一级? - Manuel Selva
是的,那不是我通常的做法。 - willcodejavaforfood
@Manuel Selva - 我总是将异常处理与业务逻辑分开。我会有一个名为'doWhatever()'的方法,该方法在try / catch块中调用'tryToDoWhatever'以处理其中的异常。 - willcodejavaforfood
请勿从此方法中抛出“Exception”。请改为抛出“IOException”。 - Dmitry Zaytsev

1
Karazi的建议是正确的。此外,为了更好地理解,Java IO API实际上是使用装饰器模式实现的。您可以在维基上查看装饰器模式

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接