【问题标题】:How close Java Input Streams?Java 输入流有多接近?
【发布时间】:2023-03-16 15:26:01
【问题描述】:

在以下代码中:

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

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

【问题讨论】:

    标签: java io stream


    【解决方案1】:

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

    【讨论】:

    • 更重要的是,它已记录在案。它有点支离破碎,但是DataInputStreamFilterInputStream 继承了close,其中记录了它在底层InputStream 上调用closedownload.oracle.com/javase/6/docs/api/java/io/… 所以你知道这种行为不仅仅是副作用一个特定的实现。
    • 其实它适用于所有类型的Closeable
    • @Sherwin ...前提是他们正确执行“合同”:-)
    【解决方案2】:

    我将利用这个机会回答我之前已经做出的答案。

    通过使用Project Lombok,您可以让 Lombok 为您正确关闭流。 详情可见here

    【讨论】:

      【解决方案3】:

      Karazi 的建议是正确的。此外,为了获得一个想法和更深入的了解,Java IO API 实际上是使用装饰器模式实现的。您可以在 wiki 上查看decorator pattern

      【讨论】:

        【解决方案4】:

        我会将 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();
            }
        }
        

        【讨论】:

        • 是的,你是对的,但这提出了一个新问题:如何处理 in.close 可能引发的 IOException ?在 finally 块中添加 try catch 或在上层转发它?
        • 是的,我通常不会这样做
        • @Manuel Selva - 我总是将异常处理与业务逻辑分开。我会有一个名为“doWhatever()”的方法,它在 try/catch 块中调用 tryToDoWhatever 来处理那里的异常
        • 不要从此方法中抛出Exception。改为抛出IOException
        猜你喜欢
        • 1970-01-01
        • 2013-12-17
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多