A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 草鱼狂飙 中级黑马   /  2014-4-4 13:50  /  3955 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package itheima;

  2. import java.io.BufferedWriter;
  3. import java.io.FileWriter;
  4. import java.io.IOException;

  5. public class day_19_1 {
  6.         public static void main(String[] args) throws IOException {
  7.                 FileWriter fw = new FileWriter("bufw.txt");
  8.                 BufferedWriter bufw = new BufferedWriter(fw);
  9.                 bufw.write("addddddd");
  10.                 bufw.close();
  11.                 if(fw==null){
  12.                         System.out.println("fw已关闭");
  13.                        
  14.                 }else
  15.                 {
  16.                         System.out.println("fw没有关闭");
  17.                 }
  18.         }
  19. }
复制代码
视频中老师说调用BufferedWriter 的close()方法就可以关闭FileWriter 的fw流
可是关闭后,为什么fw还是不为空?关闭后fw的值是什么,还是已经消失了?

5 个回复

倒序浏览
BufferedWriter bufw = new BufferedWriter(fw);   老师说过这就是个管道流  bufw.close相当于把这个管子拿掉了
fw是一个对象的引用,两者没关系
回复 使用道具 举报
李军辉 发表于 2014-4-4 14:14
BufferedWriter bufw = new BufferedWriter(fw);   老师说过这就是个管道流  bufw.close相当于把这个管子拿 ...

但是最后的fw引用还是没有为空啊?
回复 使用道具 举报
草鱼狂飙 发表于 2014-4-4 14:31
但是最后的fw引用还是没有为空啊?

对啊,就是不为空,你没有对fw进行处理  它还是指向了一个值  
  1. bufw.close;后
  2. fw = null;
  3. 哈哈,那就为空了
复制代码
回复 使用道具 举报
这里是关闭底层调用的系统资源
回复 使用道具 举报
关闭流主要是为了释放资源,虽然java有自动回收垃圾资源的功能,但是如果不关闭流,可能(只是可能)会影响自动回收的效果,造成内存大量占用。另外一个重要的原因,如果不关闭流,可能会被其他的语句访问该数据流,造成数据错误。
void close() throws IOException
Closes this stream and releases any system resources associated with it. If the stream is already closed then invoking this method has no effect.
Throws:
IOException - if an I/O error occurs

关闭该流并释放与之关联的所有资源。在关闭该流后,再调用 read()、ready()、mark()、reset() 或 skip() 将抛出 IOException。关闭以前关闭的流无效。


public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
}
一般情况下是:先打开的后关闭,后打开的先关闭

另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b

例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b

当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法

如果将节点流关闭以后再关闭处理流,会抛出IO异常
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马