2013-06-11 42 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运行程序。

相关问题