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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李杰 初级黑马   /  2012-8-23 16:10  /  1428 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

用缓冲流的时候用完直接关掉缓冲流就可以了,能不能不关缓冲流,只关掉字符流?像下面代码一样
  1. FileWriter fw=null;
  2.                
  3.                 try
  4.                 {
  5.                          fw=new FileWriter("xx.txt");
  6.                          BufferedWriter bw=new BufferedWriter(fw);
  7.                          for (int i = 0; i < 5; i++)
  8.                          {
  9.                                 bw.write("abcde");
  10.                                 bw.newLine();
  11.                                 bw.flush();
  12.                          }
  13.                 }
  14.                 catch (IOException e)
  15.                 {
  16.                         // TODO Auto-generated catch block
  17.                         e.printStackTrace();
  18.                 }
  19.                 finally
  20.                 {
  21.                         try {
  22.                                 fw.close();
  23.                         } catch (IOException e) {
  24.                                 // TODO Auto-generated catch block
  25.                                 e.printStackTrace();
  26.                         }
  27.                 }
  28.                

  29.         }
复制代码

3 个回复

正序浏览
通过查阅BufferedWriter源代码可以知道,其实bw.close()和fw.close()还是有一些差别的。

public BufferedWriter(Writer out, int sz) {
        super(out);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.out = out;//this.out是BufferedWriter的一个内部类, BufferedWriter(Writer out, int sz) 函数初始化,将Writer子类对       象引用传递给this.out内部类引用,即你的代码里fw
        cb = new char[sz];
        nChars = sz;
        nextChar = 0;
        lineSeparator = java.security.AccessController.doPrivileged(
            new sun.security.action.GetPropertyAction("line.separator"));
    }
这个函数是缓冲流的close()方法。
public void close() throws IOException {
        synchronized (lock) {
            if (out == null) {
                return;
            }
            try {
                flushBuffer();
            } finally {
                out.close();//调用初始化时传递进来的writer子类的close()方法,即你的代码你的fw.close();
                out = null;
                cb = null;//回收缓冲区的空间
            }
        }
    }
FileWriter源码里面的close()方法是继承OutputStreamWriter的close()方法。
OutputStreamWriter的close()方法又调用sun.nio.cs.StreamEncoder中的close()方法.
StreamEncoder位于sun.nio.cs包下面,其源码在我们jdk中是没有的。源码地址:http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.html,具体你可以参考下。



回复 使用道具 举报
可以的,缓冲流是装饰字符流或字节流的,缓冲流的close方法实际上就是在关闭他装饰的流。
回复 使用道具 举报
必须可以啊。因为缓冲区底层关闭的也是字符流的资源。
缓冲区只是比字符流多了些功能,并没有多调用底层资源。而close()只是关闭底层资源而已。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马