91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

利用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

合水县| 凤山市| 大化| 台中市| 伊吾县| 静海县| 昂仁县| 潮安县| 沧州市| 溆浦县| 藁城市| 三明市| 岗巴县| 广河县| 苏尼特右旗| 陵川县| 远安县| 五指山市| 宜宾县| 怀安县| 全南县| 嘉禾县| 梁河县| 永清县| 普陀区| 盘山县| 海兴县| 泾源县| 衡阳市| 福安市| 天津市| 丹凤县| 海宁市| 海原县| 青浦区| 呈贡县| 塔河县| 米脂县| 青阳县| 青神县| 五家渠市|