当前位置: 首页 > 科技观察

Java如何高效读取超大文件?(四种方法的分析比较)_0

时间:2023-03-12 19:57:53 科技观察

前言最近在优化我的PDF转word开源工具,有时候会遇到一个问题,就是如果我的PDF文件比较大,几百兆,如何让它更快更高效?通过阅读节省内存。于是我分析比较了四种常见的文件读取方式,并使用javaVisualVM工具进行分析。最后的结论是commons-io在时间和空间上效率更高。研究分析还是出自哪位baeldung洋老板。下面我将给出几种常用的读取大文件的方法。读取大文件的四种方法首先,我在本地压缩了一个文件夹,大概500M。虽然不是很大,但是相对来说还可以。方法一:Guava读取Stringpath="G:\\javabooksandtools.zip";Files.readLines(newFile(path),Charsets.UTF_8);使用guava读取还是比较简单的,一行代码就够了。接下来到jdk的bin目录下找到javaVisualVM工具,然后双击运行。从上图可以看出:耗时:20秒堆内存:最多2.5GCPU消耗:最多50%对于一个500M的文件,最大堆内存为2.5G。如果我们读取一个2G的文件,我们的电脑可能就直接死机了。方法二:ApacheCommonsIO常用方法Stringpath="G:\\javabooksandtools.zip";FileUtils.readLines(newFile(path),Charsets.UTF_8);这个方法也比较简单,也是一行代码。下面运行分析一下:从上图可以看出:耗时:17秒堆内存:最多2.5GCPU占用:最多50%,流畅运行约25%这种方式基本上消耗和以上,绝对不是我想要的。方法三:java文件流FileInputStreaminputStream=null;Scannersc=null;try{inputStream=newFileInputStream(path);sc=newScanner(inputStream,"UTF-8");while(sc.hasNextLine()){Stringline=sc.nextLine();//System.out.println(line);}if(sc.ioException()!=null){throwsc.ioException();}}finally{if(inputStream!=null){inputStream.close();}if(sc!=null){sc.close();}}这个方法其实是java中最常用的方法,接下来我们跑一波分析:从上图可以看出:耗时:32秒,堆内存翻倍:高达1G,CPU消耗减半:运行流畅度约25%。这种方法确实非常好,但是比较费时间。方式4:ApacheCommonsIO流closeQuietly(it);}这种方式的代码看起来比较简单,直接运行吧:从上图可以看出:耗时:16秒,最小堆内存:最大650M,CPU消耗减半:运行流畅关于25%可以,就是这样,牛。结语通过以上分析,我们可以得出一个结论。如果我们要读取一个大文件而选择了错误的方式,可能会极大地占用我的内存和CPU。当文件特别大时,就会造成意向不到的问题。那么为了解决此类问题,常见的读取大文件的方式有四种。通过分析比较,发现ApacheCommonsIOflow是最高效的方式。本文转载自微信公众号“愚公要移山”,可关注下方二维码。转载本文请联系愚公移山公众号。