Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android(Java)中关闭输入流_Java_Android_Inputstream - Fatal编程技术网

在Android(Java)中关闭输入流

在Android(Java)中关闭输入流,java,android,inputstream,Java,Android,Inputstream,所以。我想在Android上做一些网络方面的事情。在我的异步任务中,我正在做: 所以现在我把这件事搞砸了。我可以这样做: InputStream streamOfDestiny = null; try{ // do some network stuff here... } finally{ if(streamOfDestiny != null){ try{ streamOfDestiny.close(); }

所以。我想在Android上做一些网络方面的事情。在我的异步任务中,我正在做:

所以现在我把这件事搞砸了。我可以这样做:

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并以某种方式将其包含到我的包中。太多的工作,加上增加了我的包大小,我只需要一个功能了。瘸子

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

public static void closeStreamQuietly(InputStream streamToClose){
    try{
        streamToClose.close();
    }
    catch (IOException e){
        // ignore it....
    }
}
但这看起来就像是我在重新发明轮子,这几乎总是个坏消息——我觉得应该有一种很好的、优雅的方式来做这件事,而我在这里完全不知道


各位,有什么想法吗?

我不知道为什么您要将选项2(最后尝试内部的catch block)或选项4(创建一个小util方法)定义为丑陋或额外的工作。这是正常的,也是意料之中的

如果您最终在
中编写任何代码
,则应执行相关异常处理
,这里就是这种情况

您已经通过放置
null
复选框进行了一次异常处理(预防性),否则当
streamOfDestiny
为null时,它可能会抛出
NullPointerException


第二个异常处理是处理流关闭的异常场景所必需的,其原因可能是流
未打开
不可用
无法释放下划线资源
或类似场景等。

直接从web复制IOUtils代码:


另外,要习惯在finally块中处理异常。这将不是你最后一次看到它。

没有什么神秘的
close()
在大多数实现中调用
flush()
FilterOutputStream
)和
flush()
可以抛出
IOException,
,因为它可能执行I/O。其他可能性也是可以想象的。

您应该使用try with resources

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

我不知道——也许是我,但finally块表示应该始终执行的代码,try块是专门处理异常的代码,导致代码无法执行。我知道这在这种情况下不太适用,但我还是不喜欢。选项4并不可怕,但我只是希望框架能在某个地方处理好这一点……再一次,它感觉像是在重新发明轮子?我知道这篇文章的大部分内容都是主观的——也许过于风格化了……但是,嘿,我只是想看看我是否遗漏了一些东西。@user1864042这不是在重新发明轮子。最后一个块用于执行您认为即使发生异常也应该运行的代码段。这并不意味着您可以在finally中放入任何代码,Java将自行处理预期的异常。简单地说,
最后
块和异常处理是两个不同的概念。不要把它们混在一起。如果您正在finally块中编写一些代码,那么应该显式地完成相关的异常处理。不管你是在块里面做的,写下你的自定义方法,使用一些框架或声明为抛出等。这取决于你。@Yogndra-我明白你的意思…我想这一切都归结于一个事实,我仍然不明白为什么close应该抛出异常-我认为框架应该提供一种方法来关闭IO流而不抛出任何东西,一种实现逻辑的方法“我这里有一个IOStream对象。我不想再使用它了。请关闭它,让它停止做任何它正在做的事情,释放它正在使用的任何资源(连接等),然后让我继续我的快乐之路“@user1864042:在Oracle站点上引发问题:)这是一个通用方法。异常场景中的选择可能针对不同的程序,例如,如果您想重新尝试关闭它,因为它可能保持打开状态,如果您决定不再继续,因为流无法关闭,该怎么办。。在不同的场景中可能会有不同的需求,因此不会对此进行一般处理。如果在您的特定应用程序中,您认为它应该被静默关闭(忽略),请为相同的应用程序编写一个小的util方法。异常处理是指根据应用程序的需要处理此类场景。
try (InputStream streamOfDestiny = ...) {
    //Do you networking stuff
} catch (IOException ioe) {
    //Handle the exceptions
}