场景描述

  • 文件大小 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文件读取方式和效率性能对比相关推荐

  1. java 读取文件第一行代码,java文件读取。(单字节读取和按行读取读取)

    评论 # re: java文件读取.(单字节读取和按行读取读取) 2008-10-06 15:16 隔叶黄莺 再简单也比不过 groovy 的这一行代码 text = new File("f ...

  2. java 文件读取中文乱码_java文件读取时发生中文乱码怎么解决

    java文件读取时发生中文乱码怎么解决 发布时间:2020-06-23 09:33:47 来源:亿速云 阅读:59 作者:Leah java文件读取时发生中文乱码怎么解决?这篇文章运用了实例代码展示, ...

  3. java 多种类型文件复制_java多种文件复制方式以及效率比较

    1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...

  4. java复制文件_java多种文件复制方式以及效率比较

    1.背景 java复制文件的方式其实有很多种,可以分为 - 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,Buffere ...

  5. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径.路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:abc1.txt. 什么是相对路径呢?相对路径就是 ...

  6. java中文件读取方式的顺序_java中读取文件的方式

    java中读取文件的方式 经常遇到java中读取文件的方式,有时候需要指定编码,有时候不需要指定编码,被搞的挺晕的,抽时间整理了一下java读取文件的方式,主要是对字符型的处理,二进制的暂时不考虑. ...

  7. java文件读取异常_关于Java:从文本文件读取会引发异常

    因此,我使用了DataInputStream,FileInputStream,BufferInputStream,FileReader,BufferedReader,Scanner,将其命名. 它们都 ...

  8. java 文件读取和写入

    1.文件名 1.InputStream(字节流)  和Reader(字符流) 2.OutputStream(字节流) 和 Writer(字符流) 1.文件名 Java提供了File类 来表示一个文件( ...

  9. JAVA文件读取和写入(内附简单的代码实现)

    最近在测试链表.哈希表等数据结构的性能时,涉及到了文件的读取和写入操作.毕竟十万级的数据纯靠手动输入显然是不可能的.然后由于文件读取和写入格式的复杂性,导致JAVA中有很多不同功能的类,它们各自对应着 ...

最新文章

  1. python中6 2是什么意思_python2.6中SyntaxError是什么错误?
  2. UNREFERENCED_PARAMETER的作用 (unreferenced formal parameter 警告)
  3. java8 垃圾收集_面试官:怎么做JDK8的垃圾收集器的调优(面试常问)
  4. “德国屈臣氏”来天猫!欧洲3000家门店,优质低价背后有啥秘密
  5. 新rust怎么拆除围墙_小区围墙半夜被人拆了,破坏者竟是开发商!记者采访被推出门...
  6. 打开Delphi 10.1 berlin提示脚本错误的解决方法
  7. MySQL远程访问报错解决
  8. 709. 转换成小写字母 golang 字符串处理
  9. spingboot 集成swagger2
  10. phalcon的一些中文手册和帮助文档地址收集
  11. Scrapyd发布爬虫的工具
  12. Mac新手入门:关于Mac睡眠、开机密码的取消与更改教程
  13. C# 异步定时器,可以重载; System.Timers.Timer
  14. linux常见的三种shell,几种常见的Shell
  15. win7多国语言包下载与安装
  16. 均值cvar模型matlab代码,VAR和cvar模型的matlab代码
  17. 破解获取微信小程序源代码
  18. 苹果数据线不能充电_去掉耳机和充电器,以后数据线苹果也不会送了
  19. Linux(七)DNS域名解析服务器学习
  20. uniapp——头条小程序picker变黑色

热门文章

  1. flink怎么保证广播流比数据流先到
  2. 小满nestjs(第二十章 nestjs 爬虫)
  3. Linux基础命令---iostat--显示IO状态
  4. 2021年中国研究生数学建模竞赛C题帕金森病的脑深部电刺激治疗建模研究题目及思路参考代码
  5. mysql常用命令行操作-linux
  6. 配置Docker本地镜像仓库
  7. 中国软件公司排行~中国电子信息企业排行~
  8. Zyxel 悄悄修复防火墙产品中的严重RCE漏洞
  9. H5+css3+js搭建带验证码的登录页面
  10. 36岁大龄程序员被裁,找了2个月工作,年包从100万降到50万,要不要接?