簡體   English   中英

如何使用StringBuilder讀取Java中的大文本文件?

[英]How StringBuilder can be used to read large text files in Java?

Java中是否有任何機制可以減少讀取大型文本文件時的內存使用量?

我遇到的幾乎每個程序都使用String讀取文本文件,但是Java為每個String文字保留了空間,這就是為什么我認為由於存儲了所有String對象而導致內存使用量增加了的原因。 java.io的所有類都處理String。 但是,如果我們不使用StringBuilder,那么如何減少內存使用量呢?

畢竟,減少內存使用是StringBuilder的主要考慮因素(因為它不是像String一樣不可改變的)。 那么我們如何在不使用String的情況下,即在不使用類似這樣的東西的情況下,在Java I / O操作中利用其功能:sb.append([String object]);

為了簡單起見,假設您有n字符串,每個字符串的長度都是從輸入中讀取的,長度為1。

每次連接字符串時在strigns上使用operator+都會在每次連接字符串時創建一個String對象,因此您將獲得長度為1,2,3,...,n的字符串

因此,除了從輸入中讀取的n字符串外,組合的字符串的總內存使用量為1 + 2 + .. + n = O(n^2)

而如果您使用StringBuilder創建最終字符串,則實際上會為輸入[每個長度為1]創建n ,為最終字符串創建一個對象-大小為n ,因此總內存使用量為1 + 1 + .. + 1 + n = O(n)

因此,即使您使用sb.append(String) -空間使用情況也sb.append(String)理想,然后創建所有中間字符串-因為您無需創建中間String對象。

另外-使用StringBuilder時,性能[時間]應該更好-兩者都因為創建了更少的對象,並且都因為減少了內存使用-gc不需要像幼稚地連接字符串那樣費勁。

(*)請注意,以上內容仍然適用於任何長度的字符串。

您可以使用StringBuilders的append char方法來避免創建中間字符串,請參閱以下文章: https : //stackoverflow.com/a/9849624/102483請記住,沒有任何方法可以減少內存的占用空間。 final String,以使其小於您正在讀取的文件的大小。

根據您的操作,您可以創建一個String和/或StringBuilder對象池,這些對象加載有所需的值,然后清除然后再使用。 您可以將池配置為最大,如果不使用池中的對象,則將它們設置為null,最終垃圾回收器將回收它們。

您可能要考慮這樣的事情:

  BufferedReader reader = 
    new BufferedReader(
      new InputStreamReader(
        new ByteArrayInputStream(data)));
  String line;

  while ((line = reader.readLine()) != null)
    ...

有關更多詳細信息,請參見以下鏈接:

大字節緩沖區的BufferedReader嗎?

http://www.tutorialspoint.com/java/java_bytearrayinputstream.htm

Reader及其子類基於char和char [],只有便利方法使用String。 由於StringBuilder.append()接受char [],因此,如果僅使用圍繞char []構建的方法,則可以避免創建不必要的String對象。

請注意,雖然這減少了臨時創建的String對象的數量,但總體內存需求保持不變,但gc會收集所有其他創建的String。

代替String,嘗試使用StringBuilder附加從文件讀取的數據。 如果使用String ,則可能最終會在內存中創建多個字符串對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM