2013-06-11 44 views
0

我想要一個文件的文本追加到我的JTextPane。這對於10Mb以下的文件非常適用,但對於大小超過它的文件(我檢查了〜50Mb),我得到了臭名昭着的異常'OutOfMemoryError:Java heap space'。追加大的文本中「的OutOfMemoryError到的JTextPane結果:Java堆空間

我試圖理解爲什麼會出現Java堆內存,如果這兩種方法都是靜態的,下的,而每一次迭代就沒有「新」(線!= NULL)。如果我可以在常規的txt編輯器中打開該文件,爲什麼此代碼無法執行?

的代碼看起來是這樣的:

public static void appendFileData(JTextPane tPane, File file) throws Exception 
{ 
    try{ 

     //read file's data 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line = br.readLine(); 

     try{ 
       while (line != null) 
       { 
        JTextPaneUtil.appendToConsole(tPane, "\n"+line,Color.WHITE, "Verdana", 14); 
        line = br.readLine(); 
       } 

      }finally 
      { 
       br.close(); 
      } 

    }catch(Exception exp) 
    { 
     throw exp; 
    } 
} 

的appendToConsole是:

public static void appendToConsole(JTextPane console, String userText, Color color, String fontName, int fontSize) 
{ 
    StyleContext sc = StyleContext.getDefaultStyleContext(); 
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, color); 
    aset = sc.addAttribute(aset, StyleConstants.FontFamily, fontName); 
    aset = sc.addAttribute(aset, StyleConstants.FontSize, fontSize); 
    aset = sc.addAttribute(aset,StyleConstants.Alignment, StyleConstants.ALIGN_CENTER); 

    int len = console.getDocument().getLength(); 
    console.setCaretPosition(len); 
    console.setCharacterAttributes(aset, false); 
    console.replaceSelection(userText); 
} 
+0

這可能是因爲你的文件是不是有一個換行符(如:二進制可執行文件) – Chris

回答

3

爲什麼要爲每一行添加屬性? Swing需要做很多工作來跟蹤所有這些屬性,或者將它們合併到整個文件的一個屬性中。

嘗試使用等之後,已加載所有的數據到文本窗格在同一時間設置整個文本窗格中的屬性下面的代碼。

SimpleAttributeSet center = new SimpleAttributeSet(); 
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
doc.setParagraphAttributes(0, doc.getLength(), center, false); 

此外,我不認爲你需要通過使用屬性設置字體。您應該只能夠使用:

textPane.setFont(...); 
+0

我試圖保持它由(1)去除「appendToConsole」簡單(2)首先將所有數據讀入一個StringBuffer,然後(3)寫入一個文檔:doc.insertString(doc.getLength(),「\ n」+ sb.toString(),null);結果是我可以看到文字,但速度會變慢。任何想法如何改善這一點? – adhg

+0

嘗試使用JTextPane的read()方法。它的一個大文件,所以不要指望奇蹟。 – camickr

2

即使你的代碼沒有顯式調用new關鍵字並不意味着你打電話ISN代碼「T。我假設每次調用appendToConsole時都會重複設置字符屬性來創建一些底層對象 - 不過,您必須查看源代碼或在分析器中運行它。

此外,字符串可以創建沒有'新',所以br.readLine()創建並返回一個新的字符串爲源文件中的每一行,並附加一個「\ n」它也創建另一個新的字符串。所有這些字符串都將被添加到您的JTextPane的文檔模型中,最終將保存您加載的文件的全部內容。

默認的JVM堆大小大約爲64MB - 在JVM和代碼中加載一個〜50MB的文件以及其他支持類顯然會讓你超過這個限制,然後你會得到一個OutOfMemoryError。

要了解什麼是真正被在你的程序分配的,什麼引用遊逛,通過探查像VisualVM運行程序。

相關問題