java如何读取大文件
2015-09-08 16:12
281 查看
本文由 ImportNew - 进林 翻译自 Eugen
Paraschiv。欢迎加入翻译小组。转载请见文末要求。
本教程将演示如何用Java高效地读取大文件。这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分。
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:
这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
例如:读取一个大约1G的文件:
这种方式开始时只占用很少的内存:(大约消耗了0Mb内存)
然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了2GB内存):
这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。
现在让我们看下这种解决方案——我们将使用java.util.Scanner类扫描文件的内容,一行一行连续地读取:
这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:
由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)
这篇短文介绍了如何在不重复读取与不耗尽内存的情况下处理大文件——这为大文件的处理提供了一个有用的解决办法。
所有这些例子的实现和代码片段都可以在我的github项目上获取到——这是一个基于Eclipse的项目,所以它应该很容易被导入和运行。
原文链接: Eugen
Paraschiv 翻译: ImportNew.com - 进林
译文链接: http://www.importnew.com/14512.html
Paraschiv。欢迎加入翻译小组。转载请见文末要求。
1、概述
本教程将演示如何用Java高效地读取大文件。这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分。
2、在内存中读取
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:例如:读取一个大约1G的文件:
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。
3、文件流
现在让我们看下这种解决方案——我们将使用java.util.Scanner类扫描文件的内容,一行一行连续地读取:
4、Apache Commons IO流
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:
5、结论
这篇短文介绍了如何在不重复读取与不耗尽内存的情况下处理大文件——这为大文件的处理提供了一个有用的解决办法。所有这些例子的实现和代码片段都可以在我的github项目上获取到——这是一个基于Eclipse的项目,所以它应该很容易被导入和运行。
原文链接: Eugen
Paraschiv 翻译: ImportNew.com - 进林
译文链接: http://www.importnew.com/14512.html
相关文章推荐
- spring_150807_hibernate_transaction_annotation
- Struts2学习之package配置
- spring整合hibernate
- java 消息推送框架的比较
- 关于java虚拟机内存(解析java内存原型)
- 崩溃java (打印当前类的地址)
- [转]spring tx:advice 和 aop:config 配置事务
- Struts2的OGNL与struts2标签
- Struts2输入校验总结
- 模块化Java简介
- Struts2国际化介绍及详细说明
- Struts2拦截器介绍及说明
- MyEclipse中如何通过一个类名找到它所属的jar包
- Struts2完成文件的下载
- Struts2实现单文件的上传功能实例详解及源代码
- Java的深克隆和浅克隆
- Struts2多个文件上传的分析及源代码说明
- java.lang.IllegalMonitorStateException异常
- springmvc 国际化i18n错误: No message found under code解决方法
- Struts2类型转换的说明及案例分析