Java文件读取方式和效率性能对比
场景描述
- 文件大小 8.67G的json文件,一共670万行。
- 服务器内存:2g。(只能读取一定缓冲数据,然后处理后继续读取,不能一次性加载到内存)
- 读取文件的内容出来,并未做业务处理。
读取方式和性能对比
- 使用org.pache.commons.io.FileUtils.lineIterator,按行读,耗时:79.10s
- 使用RandomAccessFile读取文件,耗时【测试缓冲区在40k性能较好】:
- 缓冲区1k,耗时101.10s
- 缓冲区10k,耗时28.13s
- 缓冲区20k,耗时24.08s
- 缓冲区30k,耗时23.29s
- 缓冲区40k,耗时23.1s
- 使用BufferedInputStream读取文件,耗时【测试在缓冲区为40k性能最好】:
- 缓冲区1k,耗时:75.7s
- 缓冲区10K,耗时:27.10s
- 缓冲区20k,耗时:22.19s
- 缓冲区30k,耗时:21.55s
- 缓冲区40k,耗时: 20.17s
- 缓冲区50k,耗时:20.44s
- 缓冲区60k,耗时:21.24s
- 缓冲区100k,耗时:27.8s
- 缓冲区1M,耗时:30s
- 使用Scanner读文件,FileOutputStream写文件,耗时:206.78s
- 使用NIO,FileChannel读写文件,耗时【测试在每次读取35-40k性能最好】:
- NIO每次读取10k,耗时:26.03s (内存大约占用100m)
- NIO每次读取20k,耗时:22.03s (内存大约占用100m)
- NIO每次读取30k,耗时:23.03s (内存大约占用100m)
- NIO每次读取35k,耗时:19.88ss (内存大约占用100m)
- NIO每次读取40k,耗时:19.75s (内存大约占用100m)
- NIO每次读取50k,耗时:26.75s (内存大约占用100m)
- NIO每次读取100k,耗时:21.3s (内存大约占用100m)
- NIO每次读取0.5M,耗时:23.48s (内存大约占用200-300m)
- NIO每次读取5M,耗时:28.97s (内存大约占用800-1200m)
- NIO每次读取10M,耗时:30.06s (内存大约占用800-1200m)
- NIO每次读取20M,耗时:26.10s (内存大约占用800-1300m)
- NIO每次读取30M,耗时:40.10s (内存大约占用2000-2600m)
为什么scnner读取效率最慢
- 基本来说,缓冲区读取比scanner快了至少10倍
- bufferReader缓冲区大小为8KB,Scanner的缓冲区大小为1Kb.
- bufferReader知识简单的读取字符序列。而Scanner对输入数据要做正则解析。
代码示例
- org.pache.commons.io.FileUtils.lineIterator
public static void main(String[] args) throws IOException {String path = "D:\\模拟数据\\1.txt";LineIterator it = FileUtils.lineIterator(new File(path), "UTF-8");Integer counter = 1;long startTime = System.currentTimeMillis();while (it.hasNext()) {System.out.println("_-------------" + counter++);String line = it.nextLine();}long endTime = System.currentTimeMillis();System.out.println("耗费时间:" + (endTime-startTime)*1.0/1000);}
- 使用NIO,FileChannel读写文件
public static void main(String[] args) {long timeStart = System.currentTimeMillis();Integer counter = 0;try (FileInputStream input = new FileInputStream("D:\\模拟数据\\1.txt")) {FileChannel channel = input.getChannel();// 设置为 20k = 1024*20// 设置为 0.5M = 1024*512// 设置为 1M = 1024*1024// 设置为 5M = 1024*1024*5// 设置为 10M = 1024*1024*10// 设置为 20M = 1024*1024*20// 设置为 30M = 1024*1024*30ByteBuffer buffer = ByteBuffer.allocate(1024*38);while (true){int len = channel.read(buffer);if(len == -1){break;}buffer.flip();counter = counter+1;System.out.println(counter + "=======================" + buffer.array().length);String bufferStr = new String(buffer.array());buffer.clear();}} catch (IOException e) {}long timeEnd = System.currentTimeMillis();System.out.println("耗费时间:" + (timeEnd-timeStart)*1.0/1000);}
- 使用BufferedInputStream读取文件
public static void main(String[] args) {long d1 = System.currentTimeMillis();InputStream in = null;Integer counter = 0;try {in = new BufferedInputStream(new FileInputStream("D:\\模拟数据\\1.txt"));int len = 0;byte[] data = new byte[1024*1024];while ((len = in.read(data)) != -1) {String bf = new String(data, 0, len);counter++;System.out.println(counter + "======");}long d2 = System.currentTimeMillis();System.out.println("bufferedRead读取完成,耗时:" + (d2 - d1) * 1.0 / 1000);} catch (Exception e) {e.printStackTrace();} finally {try {if (in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}}}
- Scanner按行读取代码:
public static void main(String[] args) {long d1 = System.currentTimeMillis();Integer counter = 0;try (FileInputStream in = new FileInputStream("D:\\模拟数据\\1.txt")) {Scanner sc = new Scanner(in, "UTF-8");while (sc.hasNext()) {String content = sc.nextLine();counter++;System.out.println(counter + "---------");}} catch (IOException e) {}long d2 = System.currentTimeMillis();System.out.println("scannerRead读取完成,耗时:" + (d2 - d1) * 1.0 / 1000);}
- RndomAccessFile缓冲读取
public static void main(String[] args) {long d1 = System.currentTimeMillis();Integer counter = 0;try (RandomAccessFile raf = new RandomAccessFile(new File("D:\\模拟数据\\1.txt"), "r")) {int len = 0; //每次读取内容长度byte[] data = new byte[1024*30];//内容缓冲区while ((len = raf.read(data)) != -1) {String bf = new String(data, 0, len);counter++;System.out.println(counter + "==========");}} catch (IOException e) {}long d2 = System.currentTimeMillis();System.out.println("randomAccessRead读取完成,耗时:" + (d2 - d1)*1.0/1000);}
Java文件读取方式和效率性能对比相关推荐
- java 读取文件第一行代码,java文件读取。(单字节读取和按行读取读取)
评论 # re: java文件读取.(单字节读取和按行读取读取) 2008-10-06 15:16 隔叶黄莺 再简单也比不过 groovy 的这一行代码 text = new File("f ...
- java 文件读取中文乱码_java文件读取时发生中文乱码怎么解决
java文件读取时发生中文乱码怎么解决 发布时间:2020-06-23 09:33:47 来源:亿速云 阅读:59 作者:Leah java文件读取时发生中文乱码怎么解决?这篇文章运用了实例代码展示, ...
- java 多种类型文件复制_java多种文件复制方式以及效率比较
1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...
- java复制文件_java多种文件复制方式以及效率比较
1.背景 java复制文件的方式其实有很多种,可以分为 - 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,Buffere ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径.路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:abc1.txt. 什么是相对路径呢?相对路径就是 ...
- java中文件读取方式的顺序_java中读取文件的方式
java中读取文件的方式 经常遇到java中读取文件的方式,有时候需要指定编码,有时候不需要指定编码,被搞的挺晕的,抽时间整理了一下java读取文件的方式,主要是对字符型的处理,二进制的暂时不考虑. ...
- java文件读取异常_关于Java:从文本文件读取会引发异常
因此,我使用了DataInputStream,FileInputStream,BufferInputStream,FileReader,BufferedReader,Scanner,将其命名. 它们都 ...
- java 文件读取和写入
1.文件名 1.InputStream(字节流) 和Reader(字符流) 2.OutputStream(字节流) 和 Writer(字符流) 1.文件名 Java提供了File类 来表示一个文件( ...
- JAVA文件读取和写入(内附简单的代码实现)
最近在测试链表.哈希表等数据结构的性能时,涉及到了文件的读取和写入操作.毕竟十万级的数据纯靠手动输入显然是不可能的.然后由于文件读取和写入格式的复杂性,导致JAVA中有很多不同功能的类,它们各自对应着 ...
最新文章
- python中6 2是什么意思_python2.6中SyntaxError是什么错误?
- UNREFERENCED_PARAMETER的作用 (unreferenced formal parameter 警告)
- java8 垃圾收集_面试官:怎么做JDK8的垃圾收集器的调优(面试常问)
- “德国屈臣氏”来天猫!欧洲3000家门店,优质低价背后有啥秘密
- 新rust怎么拆除围墙_小区围墙半夜被人拆了,破坏者竟是开发商!记者采访被推出门...
- 打开Delphi 10.1 berlin提示脚本错误的解决方法
- MySQL远程访问报错解决
- 709. 转换成小写字母 golang 字符串处理
- spingboot 集成swagger2
- phalcon的一些中文手册和帮助文档地址收集
- Scrapyd发布爬虫的工具
- Mac新手入门:关于Mac睡眠、开机密码的取消与更改教程
- C# 异步定时器,可以重载; System.Timers.Timer
- linux常见的三种shell,几种常见的Shell
- win7多国语言包下载与安装
- 均值cvar模型matlab代码,VAR和cvar模型的matlab代码
- 破解获取微信小程序源代码
- 苹果数据线不能充电_去掉耳机和充电器,以后数据线苹果也不会送了
- Linux(七)DNS域名解析服务器学习
- uniapp——头条小程序picker变黑色