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

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

posted @ 2019-08-05 00:30  Hoult丶吴邪  阅读(2988)  评论(0编辑  收藏  举报