java为什么要关闭流 java程序中的流都要统统关闭吗有没有先后顺序
大家好,感谢邀请,今天来为大家分享一下java为什么要关闭流的问题,以及和java程序中的流都要统统关闭吗有没有先后顺序的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
java程序中的流都要统统关闭吗有没有先后顺序
理论上都得关闭,流就是把硬盘上的东西放到内存上,不关就会浪费资源
关当然有先后顺序,我找了点解释:
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常
Java中为什么先关闭输出流后关闭输入流
不绝对,要看依赖关系,先关被依赖的流,谁是被依赖的,就先关谁,比如代码中从文件A读出内容,然后写入文件B,这个时候读A要用输入流,往B写要用输出流,必须要先从A读出,然后才能往B写,所以,这个场景下,输出流依赖输入流,操作完关流的时候就要先关被依赖的输入流,再关输出流。
还有,如果关流操作在finally块中进行,顺序就无所谓了。
如果输入流和输出流完全没有依赖关系,那关流顺序就更没关系了,看心情就好。
Java IO流中先关闭输出流还是先关闭输入流为什么
java中需要手动释放的资源常见的有以下两个:
流相关资源
流相关资源一般遵循:
1)先开后关,先开的输入流,再开的输出流,通过读取输入流写入输出流中,那么应该先关输出流,再关输入流,但是一般关闭输入输出流操作都是在读写完成后的finally中执行的,所以即使先关输入流,再关输出流也不会任何问题,因为读写操作没有进行了。
2)先关外层,再关内层。如BufferedInputStream包装了一个FileInputStream,那么先
关BufferedInputStream,再关FileInputStream。但要注意的是由于一般处理流持有节点流引用,处理流都会在自己的close方法中去关闭节点流,因此我们只要关闭外层的处理流即可,如果多此一举的关闭节点流反而会报错。如BufferedInputStream包装了FileInputStream,我们只要关闭BufferedInputStream即可
3)只关处理流,不关节点流,原因见上述第二条
流相关文章参考:http://blog.csdn.net/u012250875/article/details/78341874
jdbc相关资源
Connection,PrepareStatement,ResultSet三个资源。这三个资源的获取顺序是:
先获得一个jdbc连接对象Connection,再通过连接对象获得一个sql预处理对象PrepareStatement,如果是查询的话最后还会通过PrepareStatement对象获取一个结果集ResultSet对象,关闭顺序与获取顺序正好相反。先关ResultSet,再关PrepareStatement,最后关Connection。
Java:这里的两个流都需要关闭吗
ois.close();这个一定要,每次构造ObjectInputStream都先回向流中读那4个标志字节,你只new了一次ObjectInputStream,所以只向流中读一次那4个字节,所以读完第一个对象后,流中接下来的4个字节是标志字节,不是对象的序列化信息,所以用再用readObject()会出现StreamCorruptedException异常。
is.close();也要,文件流一直打开着。
哦你说关闭ois的时候会将is也一同关闭吗?不会的,刚好理解反了。
先有了文件流,打开了文件,然后在这个基础上输入输出流,你光把输入输出关了,文件流又没变,只不过就是你开着文件不去读写罢了,流还是在的。都要关闭的。
关于java为什么要关闭流的内容到此结束,希望对大家有所帮助。