读取 txt 文件常规写法有逐行读取和按照字节缓存读取,那么按照字节缓存读取时,设置缓存区多大比较好呢?百度了一下,没发现有说这个问题的,自测了一把,以事实说话。
常规读取方法如下:
// 字节流读取 try(InputStream in = new FileInputStream("test.txt")) { byte[] readBuffer = new byte[1024]; while(in.available() > 0) { in.read(readBuffer); } } catch (Exception e) { }
我的 test.txt 文件大小为 200k,按照每次读取 1024字节,执行 3 次分别耗时:893110、880807、1202766 纳秒
按照每次读取 1024 * 1024 来读取,执行 3 次分别耗时:1028437、1260876、800448 纳秒
直接一次性读完(new byte[in.available()]),执行 3 次分别耗时:515134、265682、835523
如上3种方式,貌似缓存区间越大越好,事实是不是这样呢?我们将文件扩大20倍左右(3826k),按顺序分别执行 3 次。
每次读取 1024字节:15811857、16539536、17310929;
每次读取 1024 * 1024字节:4509521、3230585、3017516;
直接一次性读完(new byte[in.available()]):9265355、5899443、4731228
每次读取 1024 * 1024 * 1024字节:938333314、489835646、505372921
总结:
I/O字节读取缓冲区不宜设置过大,根据实际业务场景来,如果文件大部分小于1M,一次性读取完即可,大于 1M 的还是按照 1M每次读取比较好。小伙伴们觉得呢?
申明:原文发表在CSDN(https://blog.csdn.net/kuloujianzun/article/details/84134786),但因为CSDN广告太多,迁移至博客园。