java程序中的流都要统统关闭吗?有没有先后顺序??

如题所述

理论上都得关闭,流就是把硬盘上的东西放到内存上,不关就会浪费资源
关当然有先后顺序,我找了点解释:
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常追问

例如:InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
br.close();//先关依赖流
isr.close();
是这样对吧?
还有那个节点流是不是字节流,对这个概念不太懂,处理流也不懂,能指个具体例子吗?跪求啦!!!

追答

流按照不同分类,有字节流和字符流之分,还有节点流和处理流之分,不是一类概念。最根本的流有InputStream,OutputStream,Writer,Reader,任何关于流的处理都是对应这四种流(最后作为参数传递给某个处理流),按照我的理解(因为实在是没分过处理流和节点流~~),包在外边的流都是处理流,按照你举的例子,当调用了某个处理流的方法,就必须先关闭处理流,这是很容易理解的道理,比如说调用了br.read()方法,因为这个方法是阻塞式的,br是从isr中读,isr从System.in中读,直接把System.in关了肯定会抛异常;

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-05

如果使用的是jdk7.

自动的资源管理机制
   


在 Java 程序中,处理所有可能的失败路径是困难的,关闭资源也是相对困难的,因此在 Java 7 的实现中,资源管理获得了编译器的帮助,通过定义一个在资源上接口使得编译器能够自动在合适的时候来关闭资源,释放内存等资源。


自动资源管理示例

try(InputStream inFile = new FileInputStream(aFileName); 
    OutputStream outFile = new FileOutputStream(aFileName)) { 
    byte[] buf = new byte[BUF_SIZE]; 
    int readBytes; 
 while ((readBytes = inFile.read(buf)) >= 0) 
   inFile.write(buf, readBytes); 
 }

本回答被网友采纳
第2个回答  2013-09-08
自己程序打开的,要关闭
第3个回答  2018-03-05
不知道为什么有一种说法 先打开的后关闭 后打开先关闭.但是他们这些人一直在复制粘贴这些,也不解释道理. 我觉得 先关闭外层流的时候 他会自己调用内层流的close方法 只需要关闭最外层一个就可以.如果先从外层开始关 也没有问题,逐一关闭即可.