解决POI读取大Excel文件内存溢出问题 - 久曲健 - 博客园

java如何高效地读取一个超大文件?(四种方式分析对比)

前言

我最近在优化我的PDF转word的开源小工具,有时候会遇到一个问题,就是如果我的PDF文件比较大,几百兆,如何更快更节省内存的读取它。于是我分析对比了四种常见的读取文件的方式,并使用javaVisualVM工具进行了分析。最后的出的结论是commons-io时间和空间都更加的高效。研究分析依然来自哪位baeldung国外大佬。

下面我会给出几种常见的读取大文件的方式。

读取大文件的四种方式

首先我自己在本地压缩了一个文件夹,大概500M左右。虽然不是很大但是,相对还可以。

方法1:Guava读取

String path = "G:\\java书籍及工具.zip";Files.readLines(new File(path), Charsets.UTF_8);

使用guava读取比较简单,一行代码就搞定了。

下面去jdk的bin目录找到javaVisualVM工具,然后双击运行即可。

从上图可以看到:

时间消耗:20秒堆内存:最高2.5GCPU消耗:最高50%

我们一个500M的文件,堆内存最高竟然2.5G,如果我们读取一个2G的文件,可能我们的电脑直接死机了就。

方式2:Apache Commons IO普通方式

String path = "G:\\java书籍及工具.zip";FileUtils.readLines(new File(path), Charsets.UTF_8);

这种方式也比较简单,同样是一行代码。下面运行,也分析一波:

时间消耗:17秒CPU消耗:最高50%,平稳运行25%左右

这种方式和上面那种基本上消耗差不多,肯定不是我想要的。

方式3:java文件流

FileInputStream inputStream = null;Scanner sc = null;try {inputStream = new FileInputStream(path); sc = new Scanner(inputStream, "UTF-8");while (sc.hasNextLine()) { String line = sc.nextLine();//System.out.println(line); }if (sc.ioException() != null) {throw sc.ioException(); }} finally {if (inputStream != null) { inputStream.close(); }if (sc != null) { sc.close(); }}

这种方式其实就是java中最常见的方式,然后我们运行分析一波:

时间消耗:32秒,增加了一倍堆内存:最高1G,少了一半CPU消耗:平稳运行25%左右

这种方式确实很优秀,但是时间上开销更大。

方式4:Apache Commons IO流

LineIterator it = FileUtils.lineIterator(new File(path), "UTF-8");try {while (it.hasNext()) {String line = it.nextLine(); }} finally { LineIterator.closeQuietly(it);}

这种方式代码看起来比较简单,所以直接运行一波吧:

时间消耗:16秒,最低堆内存:最高650M,少了一半

OK,就它了,牛。

结论

通过以上的分析,我们可以得出一个结论,如果我们想要读取一个大文件,选择了错误的方式,就有可能极大地占用我的内存和CPU,当文件特别大时,会造成意向不到的问题。

因此为了去解决这样的问题,有四种常见的读取大文件的方式。通过分析对比,发现,Apache Commons IO流是最高效的一种方式。

java 读取大文件相关推荐

  1. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...

  2. java 读取大文件内容_java读取大文件

    java一般读取文件时,将文件文内容全部加在到内存,然后读取,但是这种读取方式很明显不适合读取大文件,在进行大文件处理时,考虑到内存有限,采用分次读取的方式. java分次读取文件内容有三种方式, 1 ...

  3. java读取 500M 以上文件,java读取大文件

    设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 package com.yjf.util;import java.io.File;import java.io. ...

  4. java读取大文件并添加入库,按行读取

    文中流程有注释 public static void main(String[] args) {//文件地址(绝对路径)String Path = "D:\\tools\\products. ...

  5. java 按行读取大文件文件内容_Java实现按行读取大文件

    Java实现按行读取大文件 String file = "F:" + File.separator + "a.txt"; FileInputStream fis ...

  6. Java高效读取大文件

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础"系列教程的一部分. ...

  7. Java高效读取大文件(转)

    Java高效读取大文件 1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础&quo ...

  8. Java 高效大文件 读取 和 写入(一亿行)

    写文件 需求:写入1亿行,7位以内的随机的数字. 首先看成果图,代表没骗大家!!!!! 这个是最终生成的文件,有770多MB .下面用glogg打开预览: 程序打印耗时 7149ms + 923 ms ...

  9. java读取1g超大图片_java读取大文件1G+ | 学步园

    正常读取大文件,可能会想到用缓存 如: package base; import java.io.BufferedInputStream; import java.io.BufferedReader; ...

最新文章

  1. String 的普通构造函数、拷贝构造函数、析构函数、赋值函数
  2. boost::asio::ip::tcp用法的测试程序
  3. 同步 异步 阻塞 非阻塞深入理解
  4. 测试点3的分析:1022 D进制的A+B (20分)——15行代码AC
  5. android布局中使用include及需注意点
  6. c语言把字符串写入文件,c语言文件读写 | 按字符,按行,按块
  7. 终极解决方案——sbt配置阿里镜像源,解决sbt下载慢,dump project structure from sbt耗时问题
  8. 虚拟环境下配置拨号接入的×××
  9. 致经典初选的60首备选篇目_致经典复选诵读题库:英诗选篇学前及小学段60首...
  10. Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)
  11. Android 电子书及阅读器Demo
  12. mega linux教程,LINUX 安装MegaRAID Storage Manager (MSM)安装使用教程.doc
  13. 可复制的领导力 重点总结读书笔记
  14. php生成财务科目编码,会计科目代码(2019会计科目代码对照表)
  15. 广东科技学院计算机学院院长,陈强-广东科技学院-计算机学院
  16. 此ca根目录证书不受信任
  17. 如果长颈鹿哭了,它会不会要哽咽好久
  18. 从《沙丘》到《三体》,科幻IP影视化改编究竟难在哪?
  19. mysql 递减查询_php – MySQL – 自动递减值
  20. 计算机科学与技术专业用英文版,计算机科学与技术专业专业英文简历模板

热门文章

  1. 华为 od 没有股票,OD的年终奖问题?
  2. Vijos-p1143三取方格数(动态规划 多进程dp)
  3. 主机/路由/交换/防火墙 OID查询、MIB浏览
  4. 计算机专业考研参考......
  5. 采用IC传感器的相对湿度测量
  6. ArcGIS基础:栅格分区转矢量再裁剪面图层【重分类】【栅格转面】
  7. 多渠道打包和apk加密可以选用的工具
  8. 1.直接法刚度矩阵建立
  9. 171122之PLSQL的使用教程
  10. Arcpy批量对栅格进行ZonalStatisticsAsTable