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
