完美解決java讀取大文件內(nèi)存溢出的問題
1. 傳統(tǒng)方式:在內(nèi)存中讀取文件內(nèi)容
讀取文件行的標(biāo)準(zhǔn)方式是在內(nèi)存中讀取,Guava 和Apache Commons IO都提供了如下所示快速讀取文件行的方法:
Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
實(shí)際上是使用BufferedReader或者其子類LineNumberReader來讀取的。
傳統(tǒng)方式的問題: 是文件的所有行都被存放在內(nèi)存中,當(dāng)文件足夠大時(shí)很快就會(huì)導(dǎo)致程序拋出OutOfMemoryError 異常。
問題思考:我們通常不需要把文件的所有行一次性地放入內(nèi)存中,相反,我們只需要遍歷文件的每一行,然后做相應(yīng)的處理,處理完之后把它扔掉。所以我們可 以通過行迭代方式來讀取,而不是把所有行都放在內(nèi)存中。
2. 大文件讀取處理方式
不重復(fù)讀取與不耗盡內(nèi)存的情況下處理大文件:
(1)文件流方式:使用java.util.Scanner類掃描文件的內(nèi)容,一行一行連續(xù)地讀取
FileInputStream inputStream = null; Scanner sc = null; try { inputStream = new FileInputStream(path); sc = new Scanner(inputStream, UTF-8); while (sc.hasNextLine()) { String line = sc.nextLine(); // System.out.println(line); } }catch(IOException e){ logger.error(e); }finally { if (inputStream != null) { inputStream.close(); } if (sc != null) { sc.close(); } }
該方案將會(huì)遍歷文件中的所有行,允許對(duì)每一行進(jìn)行處理,而不保持對(duì)它的引用。總之沒有把它們存放在內(nèi)存中!
(2)Apache Commons IO流:使用Commons IO庫實(shí)現(xiàn),利用該庫提供的自定義LineIterator
LineIterator it = FileUtils.lineIterator(theFile, UTF-8); try { while (it.hasNext()) { String line = it.nextLine(); // do something with line } } finally { LineIterator.closeQuietly(it); }
該方案由于整個(gè)文件不是全部存放在內(nèi)存中,這也就導(dǎo)致相當(dāng)保守的內(nèi)存消耗。
以上這篇完美解決java讀取大文件內(nèi)存溢出的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC結(jié)合Jcrop實(shí)現(xiàn)圖片裁剪
這篇文章主要介紹了SpringMVC結(jié)合Jcrop實(shí)現(xiàn)圖片裁剪的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12SpringMVC+MyBatis 事務(wù)管理(實(shí)例)
本文先分析編程式注解事務(wù)和基于注解的聲明式事務(wù)。對(duì)SpringMVC+MyBatis 事務(wù)管理的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2017-08-08maven倉庫中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像)
這篇文章主要介紹了maven倉庫中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringBoot使用@PostConstruct注解導(dǎo)入配置方式
這篇文章主要介紹了SpringBoot使用@PostConstruct注解導(dǎo)入配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11