如何在Java中重构关闭流?

时间:2010-10-22 01:27:41

标签: java refactoring error-handling stream

由于我公司使用Eclipse并使用Eclipse的代码自动修复的政策,以下代码模式在代码库中显得过多:

InputStream is = null;
try {
    is = url.openConnection().getInputStream();
    // .....
} catch (IOException e) {
    // handle error
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {
            // handle error
       }
    }
}

IMO它非常难以阅读,尤其是finally块中的部分(是否真的需要捕获2个IOException实例?)。无论如何都要简化代码,使其看起来更干净?

5 个答案:

答案 0 :(得分:3)

为什么什么?这是工作代码。这是对的。

保持原状。

答案 1 :(得分:1)

请参阅此question,使用closeQuietly()解决方案。

InputStream is = null;
try {
    is = url.openConnection().getInputStream();
    // .....
} catch (IOException e) {
    // handle error
} finally {
    IoUtils.closeQuietly(is);
}

// stolen from the cited question above
public class IoUtils {

  public static closeQuietly (Closeable closeable) {
    try {
      closeable.close();
    } catch (IOException logAndContinue) {
      ...
    }
  }
}

或等待JDK7's ARM blocks

答案 2 :(得分:1)

首先,关于使用IOUtils - 可能值得一提,告诉你的主管他们可能使用的应用服务器/ Java运行时环境,使用IOUtils和类似的库本身。所以实质上你并没有在你的架构中引入新的组件。

第二,不,不是真的。除了编写自己的实用程序以模仿IOUtils'closeQuietly方法之外,没有任何其他方法。

答案 3 :(得分:1)

public class Util {
    public static void closeStream(inputStream is) {
        if (is != null) {
            try {
               is.close();
            } catch (IOException e) {
               // log something
        }
    }
}

现在你的代码是

InputStream is = null;
try {
    is = url.openConnection().getInputStream();
    // .....
} catch (IOException e) {
    // handle error
} finally {
    Util.closeStream(is);
}

由于catch中的IOException可能有一些特定的处理,因此没有其他事情可做。

答案 4 :(得分:0)

您可以在某处定义类似的内容:

private static interface InputStreamCallback {

    public void doIt(InputStream is) throws IOException;

}

private void with(InputStreamCallback cb) {

    InputStream is = null;

    // Creational code. Possibly adding an argument

    try {
        cb.doIt(is);
    } catch (IOException e) {
        // handle error or rethrow.
        // If rethrow add throws to method spec.
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                // handle error or rethrow.
            }
        }
    }
}

并调用你的代码:

with(new InputStreamCallback() {

    @Override
    public void doIt(InputStream is) throws IOException {
        is = url.openConnection().getInputStream();
        // .....
    }

});

如果您在帮助程序类中使用方法static声明,那么您甚至可以执行import static

有一个缺点。您需要声明url final。

编辑:创建代码不是重点。您可以通过多种方式进行安排。回调就是重点。你可以找出你需要做的事情。