Java解决大文件读取的内存问题以及文件流的比较

传统方式

读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如Guava和Apache commons IO提供了如下快速读取文件的方式

Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));

其实现上都是利用了BufferedReader或者其子类LineNumberReader来读取的,另外Scanner是扫描的方式,其效率是很慢的。另外存在的问题有,如果是大文件,一次性内存里面存放不了,而且也不需要一次性需要用到文件的所有数据。

迭代读取方式

我们一般需要的场景是,读取一行数据到内存中,然后单独进行处理,处理完将其扔掉,不需要将其全部放入内存中,这种方式很像迭代器,Scanner 可以处理类似的情景,只需要一行一行地读取,, 其优势是可以按特定格式读取数据,处理起来方便,但是它很慢。

inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, UTF-8);
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}

另外一种方式是利用Apache Commons IO 流,其有个工具类FileUtils,处理格式上不如Scanner,但是效率和BufferedReader差不多,一般很推荐这一种。

LineIterator it = FileUtils.lineIterator(file, UTF-8);
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}

参考

https://www.breakyizhan.com/java/4018.html

https://www.jianshu.com/p/7a81f603fe1d

https://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html

最新文章

  1. Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)
  2. [转载]C#使用Interlocked进行原子操作
  3. python split函数
  4. .net_ckeditor+ckfinder的图片上传配置
  5. Python实现模拟登陆
  6. 关于Eclipse(MyEclipse)中一次性批量导入多个项目Project.
  7. xcode 必用插件二
  8. PHP中使用函数array_merge()合并数组
  9. MagicalRecord(简化CoreData操作)
  10. UVALive 6584 Escape (Regionals 2013 >> Europe - Central)
  11. 完全用Linux工作,抛弃windows
  12. Hadoop fs 命令详解
  13. iOS 滑动页面标题切换颜色渐变效果
  14. 关于 dos 下 npm 命令的使用
  15. Django框架详细介绍---认证系统
  16. SpringBoot打成jar包后,获取不到读取resources目录下文件路径的问题
  17. Lua --- 输入一个数字,输出阶乘
  18. Python自动化开发 - AJAX
  19. TensorFlow学习之路1-TensorFlow介绍
  20. SQLAlchemy 操作方法汇总

热门文章

  1. Python Tkinter小实例——模拟掷骰子
  2. leetcode110:combination-sum-ii
  3. 【阿里云-大数据】阿里云DataWorks学习视频汇总
  4. 内网渗透 day4-meterpreter基本命令
  5. python_os_shutil_获取文件夹下所有文件的大小
  6. python类继承中构造子的调用
  7. Go语言内存分配(简述 转)
  8. Java 的反射机制你了解多少?
  9. Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念
  10. 漏洞利用-FTP漏洞利用