java为什么要关闭io流 Java IO流中先关闭输出流还是先关闭输入流为什么
大家好,今天小编来为大家解答以下的问题,关于java为什么要关闭io流,Java IO流中先关闭输出流还是先关闭输入流为什么这个很多人还不知道,现在让我们一起来看看吧!
Java中的io流关闭问题
如下例子代码:
FileInputStream is= new FileInputStream(".");
BufferedInputStream bis= new BufferedInputStream(is);
bis.close();
从设计模式上看:
java.io.BufferedInputStream是java.io.InputStream的装饰类。
BufferedInputStream装饰一个 InputStream使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。
BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:
java.io.BufferedInputStream的api:
close
public void close()throws IOException关闭此输入流并释放与该流关联的所有系统资源。
因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:
public static void main(String[] args) throws Exception{
FileOutputStream fos= new FileOutputStream("d:\\a.txt");
OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8");
BufferedWriter bw= new BufferedWriter(osw);
bw.write("java IO close test");
bw.close();
}
验证ok
java中的IO流是什么啊该怎么理解啊
Java中的IO流是输入输出流。至于理解,可以将输入和输出两个端点看作是两个工厂,工厂之间需要互相运输货物,而流则是两工厂之间的公路,没有公路就不能互相运输,至于字符,字节和二进制则可以看作是运输的方式和单位大小,比如说把二进制理解成三轮车,那么字节就是小卡车,而字符则是集卡之类的。
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中,static代码块创建的IO流需要手动关闭吗
IO流除了可以手动关闭外,在垃圾回收这个对象的时候也会自动关闭。
但系统进行垃圾回收的时机是不确定的,static代码块执行完后,不会马上进行回收。在这段时间内,会造成无用的内存及IO等其他资源占用。所以最好还是用完即关。
推荐写在 try里,try块执行完自动关闭。
OK,本文到此结束,希望对大家有所帮助。