手头有两个即时的问题
首先,需要以这样的方式读取文件,以便它可以逐步更新UI而不会导致不可接受的延迟
第二,JTextArea实际处理这一数据量的能力……
第一个问题相对来说很容易修复.您需要确保的是,在读取文件时您没有阻止事件调度线程,并且您只是在事件调度线程的上下文中更新JTextArea.为此,SwingWorker是一个很好的选择,例如……
public class FileReaderWorker extends SwingWorker, String> {
private File file;
private JTextArea ta;
public FileReaderWorker(File file, JTextArea ta) {
this.file = file;
this.ta = ta;
}
public File getFile() {
return file;
}
public JTextArea getTextArea() {
return ta;
}
@Override
protected List doInBackground() throws Exception {
List contents = new ArrayList<>(256);
try (BufferedReader br = new BufferedReader(new FileReader(getFile()))) {
String text = null;
while ((text = br.readLine()) != null) {
// You will want to deal with adding back in the new line characters
// here if that is important to you...
contents.add(text);
publish(text);
}
}
return contents;
}
@Override
protected void done() {
try {
get();
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
// Handle exception here...
}
}
@Override
protected void process(List chunks) {
JTextArea ta = getTextArea();
for (String text : chunks) {
ta.append(text);
}
}
}
ps-你不需要使用List来存储内容,我只是把它作为一个例子……
第二个问题要复杂得多,需要一些额外的测试以确保它实际上是一个问题,但一般来说,超过1mb的内容往往会导致问题……
为此,您需要能够管理JScrollPane,能够从文件中向后和向前请求文本块,并尝试有效地“捏造”该过程(这样您只需要所需的文本加载,但仍然可以使它看起来像你在JTextArea中加载了所有文本)…
您还可以查看FileChannel,它提供了比标准java.io类更多的功能,包括内存映射,对于初学者,请查看Reading, Writing, and Creating Files.
您还可以考虑使用高度优化的JList或JTable来显示大量数据.这有一些局限性,因为期望固定的行高,当改变时(动态行高)会影响性能,但可能是一个合适的替代方案……