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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM