oracle 加载百万级文本文件,加载和显示大型文本文件

由于大小,您肯定希望在后台加载文件,以避免阻塞事件调度线程; SwingWorker是一个常见的选择。而不是使用Document,考虑更新TableModel的行中显示文本行。JTable..这提供了几个优点:结果将立即出现,并将减少。感知延迟。

JTable使用飞重模式渲染它的规模很大,达到了数百万兆字节的范围。

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

您可以利用分类过滤特征JTable,为例.

你可以用TablePopupEditor把注意力集中在一条线上。

增编:以下示例使用DefaultTableModel为了方便。减少架空,扩展AbstractTableModel并管理List或List,如图所示这里..该示例显示不确定的进度;将显示对显示中间进度的更改。这里.

代码: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 {

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 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();

});

}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值