BufferedReader和FileReader的区别

本文探讨了BufferedReader和FileReader在文件读取效率上的差异,指出BufferedReader自带8kb缓冲区,提供readLine()方法,适合字符读取。通过对比实验,发现两者效率相近,BufferedReader因额外的缓冲管理略慢。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BufferedReader和FileReader的区别

​ BufferedReader和BufferedWriter在内存中会自带一个8kb的字节缓冲区,并且他提供了一个程序员比较喜欢用的方法readLine();方法。

BufferedReader构造函数

从构造函数中能看到,BufferedReader实际上就是通过在内存中new一个数组来当缓冲区

   public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];
        nextChar = nChars = 0;
    }

从效率上讲,如果你从内存中自定义一个8kb的Byte[]数值来当缓冲区,调用FileWriter和FileWriter来进行读写,效率上是差不多的。

//通过BufferedReader来进行读取
BufferedReader br= null;
int len = -1;
char[] c=new char[4098]; //8kb
long start = System.currentTimeMillis();
try{
	br = new BufferedReader(new FileReader("D:\\test.txt"));
	while(len=br.read(c) !=-1 ){
		//System.out.print(new String(c,0,len));    //看情况输出
	}
	
}catch(Exception e){
	e.printStackTrace();
}finally{
	if(br != null)
		try{
			br.close();
		}catch(Exception e){
			e.printStackTrace();
		}
}
long end = System.currentTimeMillis();
System.out.println("\ntime:"+(end - start));



//通过FileReader读入数据
FileReader fr=null;
int len = -1;
char[] c=new char[4098]; //8kb
long start = System.currentTimeMillis();
try{
	fr = new FileReader("D:\\test.txt");
	
	while(len=fr.read(c) !=-1 ){
		//System.out.print(new String(c,0,len));    //看情况输出
	}
	
}catch(Exception e){
	e.printStackTrace();
}finally{
	if(fr != null)
		try{
			fr.close();
		}catch(Exception e){
			e.printStackTrace();
		}
}
long end = System.currentTimeMillis();
System.out.println("\ntime2:"+(end - start));

为了对比效率,我对一个1GB的txt文件和一个3MB左右的txt文件进行读取,并对其时间结果进行比较

//-----------------1GB*-----------------
//第一次
time:1733

time2:1644

//第二次
time:1827

time2:1767

//第三次
time:1723

time2:1642

//---------------3MB*--------------------
//第一次
time:23

time2:12

//第二次
time:28

time2:11

//第三次
time:26

time2:15

​ 从结果上看基本效率是差不多的,其实BufferedReader在内存创建了一个8kb的缓冲区,每次使用read的时候都是从BufferedReader的缓冲区中读入8kb到我们准备好的字符缓存区c中,所以效率上讲和我们自己用FileReader其实两者并没有什么太大的区别,唯一区别是BufferReader自带了一个缓存区,并且拥有readLine函数,方便我们对字符的读取。

​ 因为BufferReader自带了一个缓冲区,所以上面的读取上回出现FileReader的快一点的现象。

​ 如果喜欢尝试的话,也可以把缓冲区的大小进行调整,看看运行速度的变化。

还有一个值得注意的概念是cache和Buffer是有不同的,别把缓存区和缓冲区两者傻傻分不清。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值