Java解决大文件读取的内存问题以及文件流的比较
传统方式
读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如Guava和Apache commons IO提供了如下快速读取文件的方式
(new File(path), Charsets.UTF_8);
(new File(path));
其实现上都是利用了BufferedReader或者其子类LineNumberReader来读取的,另外Scanner是扫描的方式,其效率是很慢的。另外存在的问题有,如果是大文件,一次性内存里面存放不了,而且也不需要一次性需要用到文件的所有数据。
迭代读取方式
我们一般需要的场景是,读取一行数据到内存中,然后单独进行处理,处理完将其扔掉,不需要将其全部放入内存中,这种方式很像迭代器,Scanner 可以处理类似的情景,只需要一行一行地读取,, 其优势是可以按特定格式读取数据,处理起来方便,但是它很慢。
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, UTF-8);
while (()) {
String line = ();
// (line);
}
另外一种方式是利用Apache Commons IO 流,其有个工具类FileUtils,处理格式上不如Scanner,但是效率和BufferedReader差不多,一般很推荐这一种。
LineIterator it = (file, UTF-8);
try {
while (()) {
String line = ();
// do something with line
}
} finally {
(it);
}
参考