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