小编典典

Java尝试最终阻止关闭流

java

我想在finally块中关闭流,但是它抛出一个,IOException因此看来我必须tryfinally块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。

这是代码:

 public void read() {
    try {
        r = new BufferedReader(new InputStreamReader(address.openStream()));
        String inLine;
        while ((inLine = r.readLine()) != null) {
            System.out.println(inLine);
        }
    } catch (IOException readException) {
        readException.printStackTrace();
    } finally {
        try {
            if (r!=null) r.close();
        } catch (Exception e){
            e.printStackTrace();
        }
    }


}

阅读 214

收藏
2020-09-26

共1个答案

小编典典

似乎有点笨拙。

它是。至少java7尝试使用资源可以解决该问题。

在java7之前,您可以创建一个closeStream吞咽它的函数:

public void closeStream(Closeable s){
    try{
        if(s!=null)s.close();
    }catch(IOException e){
        //Log or rethrow as unchecked (like RuntimException) ;)
    }
}

或将try …最终放入try catch中:

try{
    BufferedReader r = new BufferedReader(new InputStreamReader(address.openStream()));
    try{

        String inLine;
        while ((inLine = r.readLine()) != null) {
            System.out.println(inLine);
        }
    }finally{
        r.close();
    }
}catch(IOException e){
    e.printStackTrace();
}

它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接近Java 7中引入的try-with-
resources

2020-09-26