2017-09-01 53 views
3

我试图在屏幕上显示使用JavaFX textarea的文本文件内容。我用小文件成功地做到了这一点,但对于大文件,一切都变得太慢了。在1秒内读取了大小为64KB的文件,并且需要2分钟才能显示它。有代码:JavaFX textarea显示大文件

try (FileReader fileReader = new FileReader(file); BufferedReader reader = new BufferedReader(fileReader)) { 
    char[] buf = new char[102400]; 
    int haveRead; 
    while ((haveRead = reader.read(buf)) != -1) { 
     buf = Arrays.copyOf(buf, haveRead); 
     String str = new String(buf); 
     textArea.appendText(str); 
     log.trace(str); 
    } 
} catch (IOException e) { 
    log.error("Error while reading file", e); 
} 

记录显示,即使与多线程几乎所有时间程序等待

textArea.appendText(STR);

怎么办?代码中有更快的实现或者我的错误吗?或者唯一的办法是做显示文本的缓冲区,以某种方式覆盖textarea滑块的行为?

+0

尽量在第一次加载文本字符串,并在同一时间显示它...更新UI需要大量的时间...所以不是'textArea.appendText(STR)'加载文本到一个字符串,然后说:'textArea.setText(YourString)' – Developer66

+0

我会尝试,但如果文件将真的很大,约2GB?并且不仅可以有一个这样的文件。 – Lless

+0

嗯,字符串被保存在内存中,所以你的'Ram'现在包含2GB以上,但在你的方法中这是相同的...也许你必须使用java选项访问Progamm的更多内存:https:// stackoverflow .com/a/2294280/8087490 – Developer66

回答

2

当您有超过1000行的文本时,请不要使用TextArea

如果你想只显示文本只需使用一个ListView<String>

但是,如果你需要编辑文本,你必须建立自己的BigTextArea或者找一个好的库。例如RichTextFx

StyleClassedTextArea bigTextArea = new StyleClassedTextArea(); 
try (FileReader fileReader = new FileReader(file); 
        BufferedReader reader = new BufferedReader(fileReader)) { 
    StringBuilder sb = new StringBuilder(); 
    while ((haveRead = reader.read(buf)) != -1) { 
     sb.append(buf); 
    } 
    bigTextArea.appendText(sb.toString()); 
} catch (IOException e) { 
    log.error("Error while reading file", e); 
} 
+0

谢谢。 ListView的速度非常快,但对我而言,它的功能太差。 我之前使用过RichTextFX,但我从未想过它比TextArea快。它是。 因此,使用RichTextFX和仅添加一个文本的50MB文件将在5秒内打开。可能会更好,但对我来说足够快。 – Lless