前言
我最近在优化我的PDF转word的开源小工具,有时候会遇到一个问题,就是如果我的PDF文件比较大,几百兆,如何更快更节省内存的读取它。于是我分析对比了四种常见的读取文件的方式,并使用javaVisualVM工具进行了分析。最后的出的结论是commons-io时间和空间都更加的高效。研究分析依然来自哪位baeldung国外大佬。
下面我会给出几种常见的读取大文件的方式。
读取大文件的四种方式
首先我自己在本地压缩了一个文件夹,大概500M左右。虽然不是很大但是,相对还可以。
方法1:Guava读取
String path = "G:\\java书籍及工具.zip";
- String path = "G:\\java书籍及工具.zip";
- Files.readLines(new File(path), Charsets.UTF_8);
使用guava读取比较简单,一行代码就搞定了。
下面去jdk的bin目录找到javaVisualVM工具,然后双击运行即可。
从上图可以看到:
我们一个500M的文件,堆内存最高竟然2.5G,如果我们读取一个2G的文件,可能我们的电脑直接死机了就。
方式2:Apache Commons IO普通方式
String path = "G:\\java书籍及工具.zip";
- String path = "G:\\java书籍及工具.zip";
- FileUtils.readLines(new File(path), Charsets.UTF_8);
这种方式也比较简单,同样是一行代码。下面运行,也分析一波:
从上图可以看到:
这种方式和上面那种基本上消耗差不多,肯定不是我想要的。
方式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中最常见的方式,然后我们运行分析一波:
从上图可以看到:
这种方式确实很优秀,但是时间上开销更大。
方式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);
- }
这种方式代码看起来比较简单,所以直接运行一波吧:
从上图可以看到:
OK,就它了,牛。
结论
通过以上的分析,我们可以得出一个结论,如果我们想要读取一个大文件,选择了错误的方式,就有可能极大地占用我的内存和CPU,当文件特别大时,会造成意向不到的问题。
因此为了去解决这样的问题,有四种常见的读取大文件的方式。通过分析对比,发现,Apache Commons IO流是最高效的一种方式。
本文转载自微信公众号「愚公要移山」,可以通过以下二维码关注。转载本文请联系愚公要移山公众号。
信息化2.0时代提出开展智慧教育创新发展行动。2019年2月,中共中央、国务院印发...
摘要 元旦期间 订单业务线 告知 推送系统 无法正常收发消息,作为推送系统维护者...
Docker生成新镜像版本的两种方式 There are two ways Docker can generate new m...
本文整理自直播《Hologres 数据导入/导出实践-王华峰(继儒)》 视频链接: https:/...
建站 什么 虚拟主机 够用?这要看搭建的是什么类型的网站。比如个人博客类型的网...
【51CTO.com快译】 数据可视化工具不断发展,提供更强大的功能,同时改善可访问...
从 10.0.0 版开始,异步迭代器就出现在 Node 中了,在本文中,我们将讨论异步迭...
在Python语言中有如下3种方法: 成员方法 类方法(classmethod) 静态方法(staticm...
2021年3月24日,主题为《数据的世界,世界的数据》的星环科技2021春季新品发布会...
前提条件 请您在购买前确保已完成注册和充值。详细操作请参见 如何注册公有云管...