java 读取大文件
解决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 读取大文件相关推荐
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...
- java 读取大文件内容_java读取大文件
java一般读取文件时,将文件文内容全部加在到内存,然后读取,但是这种读取方式很明显不适合读取大文件,在进行大文件处理时,考虑到内存有限,采用分次读取的方式. java分次读取文件内容有三种方式, 1 ...
- java读取 500M 以上文件,java读取大文件
设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 package com.yjf.util;import java.io.File;import java.io. ...
- java读取大文件并添加入库,按行读取
文中流程有注释 public static void main(String[] args) {//文件地址(绝对路径)String Path = "D:\\tools\\products. ...
- java 按行读取大文件文件内容_Java实现按行读取大文件
Java实现按行读取大文件 String file = "F:" + File.separator + "a.txt"; FileInputStream fis ...
- Java高效读取大文件
1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础"系列教程的一部分. ...
- Java高效读取大文件(转)
Java高效读取大文件 1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础&quo ...
- Java 高效大文件 读取 和 写入(一亿行)
写文件 需求:写入1亿行,7位以内的随机的数字. 首先看成果图,代表没骗大家!!!!! 这个是最终生成的文件,有770多MB .下面用glogg打开预览: 程序打印耗时 7149ms + 923 ms ...
- java读取1g超大图片_java读取大文件1G+ | 学步园
正常读取大文件,可能会想到用缓存 如: package base; import java.io.BufferedInputStream; import java.io.BufferedReader; ...
最新文章
- String 的普通构造函数、拷贝构造函数、析构函数、赋值函数
- boost::asio::ip::tcp用法的测试程序
- 同步 异步 阻塞 非阻塞深入理解
- 测试点3的分析:1022 D进制的A+B (20分)——15行代码AC
- android布局中使用include及需注意点
- c语言把字符串写入文件,c语言文件读写 | 按字符,按行,按块
- 终极解决方案——sbt配置阿里镜像源,解决sbt下载慢,dump project structure from sbt耗时问题
- 虚拟环境下配置拨号接入的×××
- 致经典初选的60首备选篇目_致经典复选诵读题库:英诗选篇学前及小学段60首...
- Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)
- Android 电子书及阅读器Demo
- mega linux教程,LINUX 安装MegaRAID Storage Manager (MSM)安装使用教程.doc
- 可复制的领导力 重点总结读书笔记
- php生成财务科目编码,会计科目代码(2019会计科目代码对照表)
- 广东科技学院计算机学院院长,陈强-广东科技学院-计算机学院
- 此ca根目录证书不受信任
- 如果长颈鹿哭了,它会不会要哽咽好久
- 从《沙丘》到《三体》,科幻IP影视化改编究竟难在哪?
- mysql 递减查询_php – MySQL – 自动递减值
- 计算机科学与技术专业用英文版,计算机科学与技术专业专业英文简历模板