关于java close()关闭流的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java close()关闭流的问题相关的知识,希望对你有一定的参考价值。

import java.io.*;

class Inlet
public static void main(String[] args) throws Exception
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\lesson\\in.txt")));
String str = br.readLine();
System.out.println(str);
br.close();
BufferedReader bb = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\lesson\\in.txt")));
str = bb.readLine();
System.out.println(str);
bb.close();



这样的话程序就没异常。

但是如果这样

import java.io.*;

class Inlet
public static void main(String[] args) throws Exception
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(str);
br.close();
BufferedReader bb = new BufferedReader(new InputStreamReader(System.in));
str = bb.readLine();
System.out.println(str);
bb.close();


运行时
第10行就会报异常

不懂的别误导我。
希望高手给讲解清楚点。

把过程说明白点。
难道有什么内部实现的区别?标准输入流关闭流的时候又什么特殊的?

因为
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 与
BufferedReader bb = new BufferedReader(new InputStreamReader(System.in));
都是由System.in封装而来,实质并没有改变,当你调用br .close(),会自动调用br 的实质System.in.close(),所以对于bb来说它已经关闭了。
而在第一个里面,你虽然关闭了br,但是第二个是通过new FileInputStream("e:\\lesson\\in.txt")新建的,所以你明白了吗?

关闭流的顺序一般遵循:先开后关,后开先关。
封装的话:先内后外的关追问

逻辑不太对啊。
第一个里面System.in 被关闭了。 难道就不可以重新连接了吗?

为什么其他别的流关闭了就可以重新连接呢?
new FileInputStream("e:\\lesson\\in.txt")

追答

可能是我语言表达能力不够好,抱歉
内部类 in是System的一个静态内部类 ,System.in 实则就是 InputStream的一个实例,你可以试着打印两个System.in的内存地址,它们应该是指向同一块的。
而new 的作用我想你应该是知道的,两次new FileInputStream("e:\\lesson\\in.txt"),虽然代码一样,但是你同样可以试着打印下内存地址,它们的指向应该是不同的。
这样说明白了么?

追问

加下我Q271677245.能详谈一下吗?

参考技术A 有点迷惑!追问楼上
System.in.close(),所以对于bb来说它已经关闭了。
这里System.in 不能自动打开吗?
参考技术B 一楼正解,顺便我问一句,如果System.in.close() 执行后,如果想再打开使用该怎么实现,相关API也看了,一时半会没整明白。 参考技术C 楼上正解

JAVA 关于FILE IO问题

FileReader file = new FileReader(objFile);
BufferedReader buffer = new BufferedReader( file );
buffer.close(); //是不是两个都要close呢
is.close();

以我的理解,只要是在单独一个语句中new一个io流的都必须关闭,
close()方法的作用是释放资源!
把对象设为NULL,让垃圾回收机来回收!
没有关闭简单来说的后果就是:该资源还是被占用着,没有释放,如果再来一个请求,
就会抛出RuntimeExcetion.
但如果是
BufferedReader br = new BufferedReader(
new FileReader(new File(file)));
的话,可以只关闭一个bufferedReader流,因为这只在一个单独语句中,而且
BufferedReader是通过fileReader来的,相当于你关闭br后就直接关闭了FileReader

参考资料:http://zhidao.baidu.com/question/71832909.html?fr=qrl&cid=870&index=2&fr2=query

参考技术A 是的,否则占用系统资源 参考技术B 在io流已使用完后都需要关闭

以上是关于关于java close()关闭流的问题的主要内容,如果未能解决你的问题,请参考以下文章

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

关于Java缓冲流的一点误解

i.grpc.internal.AbstractClientStream - 接收到的关于关闭流的数据意义

Java IO流关闭问题的深入研究

关于js中close()方法的兼容性问题

关于close和shutdown