将数据从txt文件加载到JTable

Posted

技术标签:

【中文标题】将数据从txt文件加载到JTable【英文标题】:Load data from txt file to JTable 【发布时间】:2015-06-08 15:06:51 【问题描述】:

有什么简单的方法可以加载 txt 文件中的数据,如果保存 数据从 JTable 到 txt 文件如下所示:

for (int row = 0; row < table.getRowCount(); row++) 
                    for (int col = 0; col < table.getColumnCount(); col++) 
                        out.println(table.getColumnName(col));
                        out.print(": ");
                        out.println(table.getValueAt(row, col));

或者如果用户退出程序并再次运行,也许是另一种将数据保存在 JTable 中的方法?

非常感谢您的帮助。

【问题讨论】:

如果需要更多代码,请告诉我 【参考方案1】:

您可以考虑对 JTable 进行序列化。这是将整个对象保存到文件的内置过程。

http://www.tutorialspoint.com/java/java_serialization.htm

【讨论】:

感谢提示。如果可行,我会检查并提供帮助 您可能不想使用序列化。所有 Swing 组件的 API 中有一个“警告”,即序列化不适合长期存储,因为它可能不兼容发布到发布。相反,您应该使用 XMLEncoder。 我检查了 java 文档和 Jtable 实现了 java.io.Serializable 但 JTableModel 没有。所以就像你说的,我不能使用 Serializable【参考方案2】:

从 JDK 4 开始,您可以使用 XMLEncoder 提供永久存储,并使用 XMLDecoder 重新创建您正在保存的对象。您需要创建一个PersistenceDelegate 来帮助对数据进行编码和解码。

这是DefaultTableModel 的示例:

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;

public class DefaultTableModelPersistenceDelegateTest

    private File file = new File("TableModel.xml");
    private final JTextArea textArea = new JTextArea();

    private final String[] columnNames = "Column1", "Column2";

    private final Object[][] data =
    
        "aaa", new Integer(1),
        "bbb\u2600", new Integer(2)
    ;

    private DefaultTableModel model = new DefaultTableModel(data, columnNames);
    private final JTable table = new JTable(model);

    public JComponent makeUI()
    
        model.setColumnCount(5);
        JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        sp.setResizeWeight(.3);
        sp.setTopComponent(new JScrollPane(table));
        sp.setBottomComponent(new JScrollPane(textArea));

        JPanel p = new JPanel();
        p.add(new JButton(new AbstractAction("XMLEncoder")
        
            @Override
            public void actionPerformed(ActionEvent e)
            
                try
                
                    OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
                    XMLEncoder xe = new XMLEncoder(os);
                    xe.setPersistenceDelegate(DefaultTableModel.class, new DefaultTableModelPersistenceDelegate2());
                    xe.writeObject(model);
                    xe.close();

                    Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
                    textArea.read(r, null);
                
                catch (IOException ex)
                
                    ex.printStackTrace();
                
            
        ));

        p.add(new JButton(new AbstractAction("XMLDecoder")
        
            @Override
            public void actionPerformed(ActionEvent e)
            
                try
                
                    InputStream is = new BufferedInputStream( new FileInputStream( file ));
                    XMLDecoder xd = new XMLDecoder(is);
                    model = (DefaultTableModel)xd.readObject();
                    table.setModel(model);
                
                catch (IOException ex)
                
                    ex.printStackTrace();
                
            
        ));

        p.add(new JButton(new AbstractAction("clear")
        
            @Override
            public void actionPerformed(ActionEvent e)
            
                model = new DefaultTableModel();
                table.setModel(model);
            
        ));

        JPanel pnl = new JPanel(new BorderLayout());
        pnl.add(sp);
        pnl.add(p, BorderLayout.SOUTH);
        return pnl;
    

    public static void main(String[] args)
    
        EventQueue.invokeLater(new Runnable()
        
            @Override public void run()
            
                createAndShowGUI();
            
        );
    

    public static void createAndShowGUI()
    
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new DefaultTableModelPersistenceDelegateTest().makeUI());
        f.setSize(420, 340);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    


//http://www.oracle.com/technetwork/java/persistence4-140124.html

class DefaultTableModelPersistenceDelegate extends DefaultPersistenceDelegate

    //  Initially creates an empty DefaultTableModel. The columns are created
    //  and finally each row of data is added to the model.

    @Override
    protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder)
    
        DefaultTableModel model= (DefaultTableModel)oldInstance;

        Vector<String> columnNames = new Vector<String>(model.getColumnCount());

        for (int i = 0; i < model.getColumnCount(); i++)
        
            columnNames.add( model.getColumnName(i) );
        

        Object[] columnNamesData = new Object[]  columnNames ;
        encoder.writeStatement(new Statement(oldInstance, "setColumnIdentifiers", columnNamesData));

        Vector row = model.getDataVector();

        for (int i = 0; i < model.getRowCount(); i++)
        
            Object[] rowData = new Object[]  row.get(i) ;
            encoder.writeStatement(new Statement(oldInstance, "addRow", rowData));
        
    

上面的代码是一个更完整的解决方案示例:How to write a JTable state with data in xml file using XMLEndcoder in java

示例中的文本区域仅用于显示正在保存的数据的 XML 文件的内容。

【讨论】:

以上是关于将数据从txt文件加载到JTable的主要内容,如果未能解决你的问题,请参考以下文章

无法将制表符分隔的 Txt 文件从 S3 加载到 Redshift

通过消除重复将数据从文本文件加载到mysql数据库

将文本文件 (.txt) 加载到 bigquery 表的最佳方法

将 .txt 文件中的数据加载到 Hive 中存储为 ORC 的表中

从 txt 文件中读取数据并将其添加到 Observable 集合中

将数据从 txt 文件导入 IBM netezza SQL 数据库的错误