BufferedReader和FileReader的区别
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是有不同的,别把缓存区和缓冲区两者傻傻分不清。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)