java读取文本并显示,java – 如何在Swing中读取和显示大文本文件?

手头有两个即时的问题

首先,需要以这样的方式读取文件,以便它可以逐步更新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来显示大量数据.这有一些局限性,因为期望固定的行高,当改变时(动态行高)会影响性能,但可能是一个合适的替代方案……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值