关于java中io流的关闭问题,部分代码,这种情况用不用关闭new FileReader(file)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java中io流的关闭问题,部分代码,这种情况用不用关闭new FileReader(file)?相关的知识,希望对你有一定的参考价值。

BufferedReader br = null;
br=new BufferedReader(new FileReader(file));
br.close();

参考技术A 是的,你的new FileReader(file)是一个匿名对象。

JVM中对于那些打开了没有关闭的IO文件流,会在不再被使用的情况下,等到下次做Full GC的时候把他们全部回收,尽量少使用这种写法。文章来自:http://blog.csdn.net/kongxx/article/details/6405914
参考技术B public BufferedReader(Reader in) 
    this(in, defaultCharBufferSize);

public BufferedReader(Reader in, int sz) 
    ...
    this.in = in;//FileReader
    ...

看BufferedReader的close方法:

public void close() throws IOException 
    ...
    in.close();//调用FileReader的close方法
    ...

调用BufferedReader的close()方法就可以调用FileReader的close()方法,所以楼上的回答不正确.

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关了肯定会抛异常;

参考技术A

如果使用的是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); 
 

参考技术B 自己程序打开的,要关闭 参考技术C 不知道为什么有一种说法 先打开的后关闭 后打开先关闭.但是他们这些人一直在复制粘贴这些,也不解释道理. 我觉得 先关闭外层流的时候 他会自己调用内层流的close方法 只需要关闭最外层一个就可以.如果先从外层开始关 也没有问题,逐一关闭即可.

以上是关于关于java中io流的关闭问题,部分代码,这种情况用不用关闭new FileReader(file)?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 关于FILE IO问题

Java中try()...catch()用法

java IO包装流如何关闭

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

java关闭IO流的时候Socket也同时关闭

java异常中的finally