欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

完美解決java讀取大文件內(nèi)存溢出的問題

 更新時(shí)間:2017年08月10日 08:32:12   投稿:jingxian  
下面小編就為大家?guī)硪黄昝澜鉀Qjava讀取大文件內(nèi)存溢出的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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)文章

  • Java字符編碼解碼的實(shí)現(xiàn)詳解

    Java字符編碼解碼的實(shí)現(xiàn)詳解

    本篇文章介紹了,Java字符編碼解碼的實(shí)現(xiàn)詳解。需要的朋友參考下
    2013-05-05
  • SpringMVC結(jié)合Jcrop實(shí)現(xiàn)圖片裁剪

    SpringMVC結(jié)合Jcrop實(shí)現(xiàn)圖片裁剪

    這篇文章主要介紹了SpringMVC結(jié)合Jcrop實(shí)現(xiàn)圖片裁剪的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring?JPA之find拓展方法示例詳解

    Spring?JPA之find拓展方法示例詳解

    這篇文章主要為大家介紹了Spring?JPA之find拓展方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • SpringMVC+MyBatis 事務(wù)管理(實(shí)例)

    SpringMVC+MyBatis 事務(wù)管理(實(shí)例)

    本文先分析編程式注解事務(wù)和基于注解的聲明式事務(wù)。對(duì)SpringMVC+MyBatis 事務(wù)管理的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2017-08-08
  • Java中的攔截器、過濾器、監(jiān)聽器用法詳解

    Java中的攔截器、過濾器、監(jiān)聽器用法詳解

    這篇文章主要介紹了Java中的攔截器、過濾器、監(jiān)聽器用法,詳細(xì)分析了Java攔截器、過濾器、監(jiān)聽器的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • Java基礎(chǔ)之代理原理與用法詳解

    Java基礎(chǔ)之代理原理與用法詳解

    這篇文章主要介紹了Java基礎(chǔ)之代理原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了java代理的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • maven倉庫中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像)

    maven倉庫中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像)

    這篇文章主要介紹了maven倉庫中心mirrors配置多個(gè)下載中心(執(zhí)行最快的鏡像),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot使用@PostConstruct注解導(dǎo)入配置方式

    SpringBoot使用@PostConstruct注解導(dǎo)入配置方式

    這篇文章主要介紹了SpringBoot使用@PostConstruct注解導(dǎo)入配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java SoftReference類案例詳解

    Java SoftReference類案例詳解

    這篇文章主要介紹了Java SoftReference類案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Mybatis插入數(shù)據(jù)后自增id獲取方式

    Mybatis插入數(shù)據(jù)后自增id獲取方式

    在MyBatis中,獲取自增主鍵可以通過useGeneratedKeys屬性或selectKey節(jié)點(diǎn)實(shí)現(xiàn),useGeneratedKeys設(shè)置時(shí),需設(shè)置keyProperty指定主鍵字段,數(shù)據(jù)庫表也要相應(yīng)設(shè)置,selectKey節(jié)點(diǎn)可在插入操作后,通過特定SQL查詢獲得主鍵
    2024-09-09

最新評(píng)論