关于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();
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)?