在Android(Java)中关闭输入流

时间:2012-12-03 04:58:48

标签: java android inputstream

因此。我正在尝试在Android上做一些网络工作。在我的异步任务中,我正在做:

InputStream streamOfDestiny = null;

try{
    // do some network stuff here...
}
finally{
    if(streamOfDestiny != null){
        streamOfDestiny.close(); // Build error here. Apparently, closing a stream can cause an IOException. Why this is the case, I do not know. But it is. And, since this is Java, I apparently need to care.
    }
}

所以现在我已经把这个IOException搞砸了。我可以这样做:

InputStream streamOfDestiny = null;

try{
    // do some network stuff here...
}
finally{
    if(streamOfDestiny != null){
        try{
            streamOfDestiny.close();
        }
        catch(IOException e){
            // Hey look! I'm inside a catch block, inside a finally block!
        }
    }
}

但这看起来很糟糕。 finally块中的try / catch块?多丑啊!我可以把它放在未封闭的状态,但这对我来说似乎是不好的做法,只是感觉不对(我开始流,我想完成它)。我能做到这一点:

IOUtils.closeQuietly(streamOfDestiny);

但现在我必须找到org.apache.commons.io.IOUtils并以某种方式将其包含在我的包中。太多的工作,加上我的包装尺寸,我只需要一个功能。跛。

我总是可以写自己的closeQuietly版本:

public static void closeStreamQuietly(InputStream streamToClose){
    try{
        streamToClose.close();
    }
    catch (IOException e){
        // ignore it....
    }
}

但这似乎我正在重新发明轮子,这几乎总是坏消息 - 感觉应该有一些漂亮,优雅的方式做到这一点,我在这里完全失踪。

任何想法的人?

4 个答案:

答案 0 :(得分:0)

我不确定你为什么要将你的选项-2(最终的try-catch块)或选项-4(创建一个小的util方法)称为丑陋或额外的工作。这是正常的和预期的。

如果您在finally内编写任何代码,则应完成相关的异常处理,这就是这种情况。

通过null检查您已经完成(预防性)的一个例外处理,否则当NullPointerException为空时它可能会抛出streamOfDestiny

需要第二个异常处理来处理流关闭的异常情况,这可能是因为Stream为not openunavailableit's not able to release the underline resources或类似{{3等等。

答案 1 :(得分:0)

直接从网络上复制IOUtils代码:

http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.closeQuietly%28java.io.InputStream%29

此外,习惯finally块中的异常处理。这不是你最后一次看到它。

答案 2 :(得分:0)

没有神秘感。 close()在大多数实现中调用flush()(请参阅FilterOutputStream的Javadoc),flush()可以抛出IOException,,因为它可能会执行I / O.其他可能性是可以想象的。

答案 3 :(得分:0)

你应该尝试使用资源。

try (InputStream streamOfDestiny = ...) {
    //Do you networking stuff
} catch (IOException ioe) {
    //Handle the exceptions
}