gpt4 book ai didi

java - 加载和显示大文本文件

转载 作者:太空狗 更新时间:2023-10-29 22:44:15 25 4
gpt4 key购买 nike

在 Swing 应用程序中,我有时需要支持对加载缓慢的大型、面向行的文本文件的只读访问:日志、转储、跟踪等。对于少量数据,suitable DocumentJTextComponent 没问题,如图here .我理解浏览大量数据的人为限制,但有问题的东西似乎总是在最大的文件中。对于 10-100 兆字节、百万行范围内的大量文本,是否有任何实用的替代方法?

最佳答案

由于大小,您肯定希望在后台加载文件以避免阻塞 event dispatch thread ; SwingWorker 是一个共同的选择。而不是使用 Document , 考虑更新 TableModel并在 JTable 的行中显示文本行.这提供了几个优势:

  • 结果将立即开始出现,感知延迟将减少。

  • JTable使用享元模式 rendering ,可以很好地扩展到数兆字节、百万行范围。

  • 您可以在读取输入时解析输入以创建任意列结构。

  • 您可以利用 sorting and filtering JTable 的特点, 对于 example .

  • 您可以使用 TablePopupEditor 专注于一行。

附录:下面的示例使用 DefaultTableModel为了方便。减少overhead , 扩展 AbstractTableModel并管理一个List<String>List<RowData> ,如图here .该示例显示不确定的进度;显示中间进度的更改显示 here .

代码:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
* @see https://stackoverflow.com/a/25526869/230513
*/
public class DisplayLog {

private static final String NAME = "/var/log/install.log";

private static class LogWorker extends SwingWorker<TableModel, String> {

private final File file;
private final DefaultTableModel model;

private LogWorker(File file, DefaultTableModel model) {
this.file = file;
this.model = model;
model.setColumnIdentifiers(new Object[]{file.getAbsolutePath()});
}

@Override
protected TableModel doInBackground() throws Exception {
BufferedReader br = new BufferedReader(new FileReader(file));
String s;
while ((s = br.readLine()) != null) {
publish(s);
}
return model;
}

@Override
protected void process(List<String> chunks) {
for (String s : chunks) {
model.addRow(new Object[]{s});
}
}
}

private void display() {
JFrame f = new JFrame("DisplayLog");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
JProgressBar jpb = new JProgressBar();
f.add(jpb, BorderLayout.NORTH);
f.add(new JScrollPane(table));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
LogWorker lw = new LogWorker(new File(NAME), model);
lw.addPropertyChangeListener((PropertyChangeEvent e) -> {
SwingWorker.StateValue s = (SwingWorker.StateValue) e.getNewValue();
jpb.setIndeterminate(s.equals(SwingWorker.StateValue.STARTED));
});
lw.execute();
}

public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new DisplayLog().display();
});
}
}

关于java - 加载和显示大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25526833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com