黑马程序员技术交流社区
标题:
关于IO流的一个小疑问
[打印本页]
作者:
lcjasas
时间:
2013-4-5 16:29
标题:
关于IO流的一个小疑问
本帖最后由 lcjasas 于 2013-4-6 22:00 编辑
import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
//创建一个读取流对象和文件相关联。
FileReader fr = new FileReader("buf.txt");
//为了提高效率,加入缓冲技术,将字符读取流作为参数传递给缓冲区对象的构造函数
BufferedReader bufr = new BufferedReader(fr);
String line = null;//初始化
while((line=bufr.readLine())!=null)
{
System.out.println(line);
}
bufr.close();
}
}
(FileReader )建立的对象,是不是因为其没有具体的构造函数就不用fr.close();
还是说FileReader fr = new FileReader(".....");对象建立后,就自动结束了?
作者:
随便
时间:
2013-4-5 16:50
本帖最后由 邓宫财 于 2013-4-5 16:59 编辑
这是BuffereReader的close方法代码
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
<font color="#ff00ff">in.close();//关闭的就是外部传入的字符读取流</font>
in = null;
cb = null;
}
}
复制代码
BufferedReader的构造方法
BufferedReader(Reader in)就是调用的这个构造。
public BufferedReader(Reader in, int sz) {
super(in);
if (sz <= 0)
throw new IllegalArgumentException("Buffer size <= 0");
<font color="#ff00ff"> this.in = in;//外部传进的字符读取l流,赋给了BufferedReader</font>
cb = new char[sz];
nextChar = nChars = 0;
}
复制代码
分析,其实BufferedReader的缓冲技术就是把传入的Reader读取的数据,存起来,然后一起读取给你。这就是缓冲技术。
所以BufferedReader的关闭实际上是关闭的是传入的输入流。
这类问题,最好的方法就是读源码。
bufr.close();//实际上是调用的fr.close();
作者:
徐升2013
时间:
2013-4-5 18:38
我也才学IO流这里我的理解是这样的,你可以参考下:
首先第一点你问的是不是没有构造函数,这里的思想就错了,没有构造函数你咋创建的
fr
对象呢?
而你创建了这个对象 定义成名字FR只是为了下面调用的时候使用,这时在内存中已经存在这个流了 ,所以就必须得执行关闭动作。
而在执行bufr。close方法的时候的原理实际上调用的就是fr。close这两个类是继承关系的,bufr.close()方法的内部实现就是调用的父类的close方法。
作者:
杜加璇
时间:
2013-4-5 19:24
这个流是必须得关的也就是执行bufr.close();BufferedReader的缓冲技术就是在执行bufr.readLine会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个,程序再次读取时, 就不用找文件了, 直接从缓冲区中获取,直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个;如果你不关流的话可能会导致数据在缓冲区内无法读取,而且流一直开着会一直和文件关联着会占用内存。
作者:
陈丽莉
时间:
2013-4-6 19:47
记得追问,或者结贴~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2