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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付凯鹏 中级黑马   /  2013-11-14 16:40  /  1843 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
public class BuferedRead_1{
        public static void main(String[] args) throws IOException
{
                FileReader fr=new FileReader("E:\\aa.txt");
                BufferedReader bufr=new BufferedReader(fr);
                String s1=bufr.readLine();
                System.out.print(s1);
                bufr.close();
        }
}
请问各位同学,在最后用不用加上fr.close();/为什么呢??????

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 加油吧~同学!

查看全部评分

7 个回复

倒序浏览
要不要呢??我们来看下bufferedreader的源码把,下面是buffered的close方法
public void close() throws IOException {
        synchronized (lock) {
            if (in == null)
                return;
            in.close();
            in = null;
            cb = null;
        }
其中in的定义是private Reader in;所以在bufferedreader的close方法中是有关闭reader in的,所以不需要再次关闭。
以后这类问题你可以进入这个类的源码,源码一看清清楚楚。

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
流形象说来就是一根管道,BufferedReader 就是套在FileReader管道上的另一根好用的管道,当BufferedReader关闭时,等于取走了这根管道,流已经不存在了,所以就不用关FileReader了
回复 使用道具 举报
hel 中级黑马 2013-11-14 19:55:00
板凳
不用关闭,因为bufr.close();的内部就是调用的 fr.close();
所以不用关闭
回复 使用道具 举报
不用了,BufferedReader本身是包装流,是对本身的 FileReader提高效率而存在,对 FileReader进行包装,所以它引用的也就是 FileReader的东西,所以 FileReader fr不需要关闭了。
回复 使用道具 举报
java.io.BufferedReader与java.io.BufferedWriter类各拥有8192字符的缓冲区。当 BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如 果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出至目的地,而是先存储至缓冲区中。如果缓冲区中的数 据满了,才会一次对目的地进行写出。例如一个文件,通过缓冲区可减少对硬盘的输入/输出动作,以提高文件存取的效率。
之前在介绍取得用户输入时,就使用过BufferedReader。从标准输入流System.in中直接读取用户输入时,用户每输入一个字 符,System.in就读取一个字符。为了能一次读取一行用户的输入,使用了BufferedReader来对用户输入的字符进行缓冲。 readLine()方法会在读取到用户的换行字符时,再一次将整行字符串传入。
System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。例如:
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
范例14.19示范了BufferedReader与BufferedWriter的使用。可以在文字模式下输入字符,程序会将输入的文字存储至指定的文件中,如果要结束程序,输入quit字符串即可。
范例14.19  BufferedReaderWriterDemo.java
package onlyfun.caterpillar;import java.io.*;public class BufferedReaderWriterDemo {
public static void main(String[] args) {
try {
// 缓冲System.in输入流
BufferedReader bufReader =
new BufferedReader(
new InputStreamReader(System.in));
// 缓冲FileWriter字符输出流
BufferedWriter bufWriter =
new BufferedWriter(new FileWriter(args[0]));            String input = null;            // 每读一行进行一次写入动作
while(!(input =
bufReader.readLine()).equals("quit")) {
bufWriter.write(keyin);
// newLine()方法写入与操作系统相依的换行字符
bufWriter.newLine();
}            bufReader.close();
bufWriter.close();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("没有指定文件");
}
catch(IOException e) {
e.printStackTrace();
}
}
}
由于换行字符依操作系统不同而有所区别,在Windows下是/r/n,在Linux下是/n,在Mac OS下是/r,您可以使用newLine()方法,由执行环境依当时的操作系统决定该输出哪一种换行字符

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
因为BufferedReader的作用是用来提高读数据的性能的,真正进行读写操作的是FileReader,FileWriter.     本质上来说,要关闭FileReader,FileWriter的流。  但是如果我们用了BufferedReader的close()方法,实质它封装了关闭FileReader,FileWriter的流的close()方法。
回复 使用道具 举报
不用关,因为BufferedReader已经调用了close()就不用再关闭资源了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马