中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用java讀取超大文件時出現內存溢出如何解決

發布時間:2020-12-01 17:08:11 來源:億速云 閱讀:917 作者:Leah 欄目:編程語言

利用java讀取超大文件時出現內存溢出如何解決?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1. 傳統方式:在內存中讀取文件內容

讀取文件行的標準方式是在內存中讀取,Guava 和Apache Commons IO都提供了如下所示快速讀取文件行的方法:

Files.readLines(new File(path), Charsets.UTF_8); 
FileUtils.readLines(new File(path));

實際上是使用BufferedReader或者其子類LineNumberReader來讀取的。

傳統方式的問題: 是文件的所有行都被存放在內存中,當文件足夠大時很快就會導致程序拋出OutOfMemoryError 異常。

問題思考:我們通常不需要把文件的所有行一次性地放入內存中,相反,我們只需要遍歷文件的每一行,然后做相應的處理,處理完之后把它扔掉。所以我們可 以通過行迭代方式來讀取,而不是把所有行都放在內存中。

2. 大文件讀取處理方式

不重復讀取與不耗盡內存的情況下處理大文件:

(1)文件流方式:使用java.util.Scanner類掃描文件的內容,一行一行連續地讀取

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();
   }
}

該方案將會遍歷文件中的所有行,允許對每一行進行處理,而不保持對它的引用。總之沒有把它們存放在內存中!

(2)Apache Commons IO流:使用Commons IO庫實現,利用該庫提供的自定義LineIterator

LineIterator it = FileUtils.lineIterator(theFile, UTF-8); 
try {
 while (it.hasNext()) {
 String line = it.nextLine(); 
 // do something with line 
  } 
} finally {
 LineIterator.closeQuietly(it);
}

 該方案由于整個文件不是全部存放在內存中,這也就導致相當保守的內存消耗。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

香港| 来宾市| 科技| 明星| 玉屏| 新津县| 中牟县| 内江市| 永春县| 阜城县| 临西县| 昌宁县| 灌云县| 莎车县| 临朐县| 义乌市| 乐昌市| 滦平县| 连州市| 大方县| 东乡| 海门市| 潮安县| 固阳县| 洪泽县| 开封县| 南乐县| 巫溪县| 海原县| 特克斯县| 龙南县| 临沭县| 基隆市| 军事| 仲巴县| 万州区| 海晏县| 平远县| 建宁县| 嘉义县| 登封市|