当前位置: 首页 > 知识库问答 >
问题:

从文件中读取所需数据,但保存整个文件数据

沈伟
2023-03-14

我使用swing制作了一个GUI,我将数据从文本文件读取到jtable,文本文件有6列5行,3行的值为0,0.0,0,0,0。所以我想在JTable中显示值,直到它遇到0为止。但要在保存时保存全文文件,这意味着值为5行。这是我的密码:

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

public class Bb extends JFrame
{
 private JTable table;
 private DefaultTableModel model;

 @SuppressWarnings("unchecked")
 public Bb()
 {
      String aLine ;
      Vector columnNames = new Vector();
      Vector data = new Vector();

      try
      {
           FileInputStream fin = new FileInputStream("Bbb.txt");
           BufferedReader br = new BufferedReader(new InputStreamReader(fin));



           StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");

           while( st1.hasMoreTokens())
           {
                columnNames.addElement(st1.nextToken());
           }



           while ((aLine = br.readLine()) != null )
           {
                StringTokenizer st2 = new StringTokenizer(aLine, " ");
                Vector row = new Vector();

                while(st2.hasMoreTokens())
                {
                     row.addElement(st2.nextToken());
                }
                  data.addElement( row );
           }
           br.close();
      }
      catch (Exception e)
      {
           e.printStackTrace();
      }


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

      JScrollPane scrollPane = new JScrollPane( table );
      getContentPane().add( scrollPane );

      JPanel buttonPanel = new JPanel();
      getContentPane().add( buttonPanel, BorderLayout.SOUTH );


      JButton button2 = new JButton( "SAVE TABLE" );
      buttonPanel.add( button2 );
      button2.addActionListener( new ActionListener()
      {
           public void actionPerformed(ActionEvent e)
           {


                   if  ( table.isEditing() )
                {
                     int row = table.getEditingRow();
                     int col = table.getEditingColumn();
                     table.getCellEditor(row, col).stopCellEditing();
                }

                int rows = table.getRowCount();
                int columns = table.getColumnCount();


                try { 

StringBuffer Con = new StringBuffer();
for (int i = 0; i < table.getRowCount(); i++)
  {
        for  (int j = 0; j < table.getColumnCount(); j++)
     {

       Object Value = table.getValueAt(i, j);
       Con.append(" ");
           Con.append(Value);
         }
   Con.append("\r\n");
   }

FileWriter fileWriter = new FileWriter(new File("cc.txt"));
fileWriter.write(Con.toString());
    fileWriter.flush();
fileWriter.close();  
        }  
        catch (Exception ex) {  
            ex.printStackTrace();  
        }  
           }
      });



 }

 public static void main(String[] args)
 {
      Bb frame = new Bb();
      frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
      frame.pack();
      frame.setVisible(true);
  }

}

和文本文件:

1 2 6 0.002 0.00 2
2 5 5 0.005 0.02 4
0 0 0 0.000 0.00 0
4 8 9 0.089 0.88 7
5 5 4 0.654 0.87 9

共有1个答案

宋博易
2023-03-14

我能理解你想要什么

对于第一部分,您只想在JTable中显示数据,直到遇到0

代码:

 while ((aLine = br.readLine()) != null) {
            String[] sp = aLine.split(" ");
            if (sp[0].equals("0")) {
                break;
            }
            StringTokenizer st2 = new StringTokenizer(aLine, " ");
            Vector row = new Vector();

            while (st2.hasMoreTokens()) {

                String s = st2.nextToken();
                row.addElement(s);
            }

            data.addElement(row);
        }

说明:当您读取每一行时,将其拆分,因此如果每一拆分行的第一个元素为零,则您将退出循环,并且不会在循环中显示任何其他值。

为了将您的所有数据从第一个文件保存到第二个文件,您应该将它们从第一个文件复制到第二个文件,因为您的JTable没有足够的信息来帮助您实现这一目标。

注:我不明白你为什么要这样做,但你可以通过以下方式实现

代码:

button2.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            if (table.isEditing()) {
                int row = table.getEditingRow();
                int col = table.getEditingColumn();

                table.getCellEditor(row, col).stopCellEditing();
            }

            int rows = table.getRowCount();
            int columns = table.getColumnCount();

            try {
                String st = "";
                FileInputStream fin = new FileInputStream("C:\\Users\\J Urguby"
                        + "\\Documents\\NetBeansProjects\\Bb\\src\\bb\\Bbb.txt");
                Scanner input = new Scanner(fin).useDelimiter("\\A");
                while (input.hasNext()) {
                    st = input.next();
                    System.out.println("st is " + st);
                }

                FileWriter fileWriter = new FileWriter(new File("C:\\Users\\J Urguby"
                        + "\\Documents\\NetBeansProjects\\Bb\\src\\bb\\cc.txt"));
                fileWriter.write(st);
                fileWriter.flush();
                fileWriter.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    });

说明:您使用Scanner技巧读取整个文件,然后将其写入第二个文件。资料来源:https://weblogs.java.net/blog/pat/archive/2004/10/stupid_scanner.html

根据OP的要求

代码:

 public Bb() {
        String aLine;
        Vector columnNames = new Vector();
        Vector data = new Vector();
        boolean found = false;
        StringBuilder temp = new StringBuilder();
        /*Using try catch block with resources Java 7 
          Read about it
        */
        try (FileInputStream fin = new FileInputStream("C:\\Users\\8888"
                + "\\Documents\\NetBeansProjects\\Bb\\src\\bb\\Bbb.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fin))) {

            StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
            //the first line of the txt file fill colum names
            while (st1.hasMoreTokens()) {
                String s = st1.nextToken();
                columnNames.addElement(s);
            }

            while ((aLine = br.readLine()) != null) {
                String[] sp = aLine.split(" ");
                if (sp[0].equals("0") && !found) {
                    found = true;
                } else if (found) {
                    temp.append(aLine).append("\r\n");
                } else if (!sp[0].equals("0") && !found) {
                    StringTokenizer st2 = new StringTokenizer(aLine, " ");
                    Vector row = new Vector();
                    while (st2.hasMoreTokens()) {
                        String s = st2.nextToken();
                        row.addElement(s);
                    }
                    data.addElement(row);
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

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

        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);

        JPanel buttonPanel = new JPanel();
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);

        JButton button2 = new JButton("SAVE TABLE");
        buttonPanel.add(button2);
        button2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (table.isEditing()) {
                    int row = table.getEditingRow();
                    int col = table.getEditingColumn();

                    table.getCellEditor(row, col).stopCellEditing();
                }

                int rows = table.getRowCount();
                int columns = table.getColumnCount();

                try {
                    StringBuilder con = new StringBuilder();
                    for (int i = 0; i < table.getRowCount(); i++) {
                        for (int j = 0; j < table.getColumnCount(); j++) {
                            Object Value = table.getValueAt(i, j);
                            con.append(" ");
                            con.append(Value);
                        }
                        con.append("\r\n");
                    }

                    try (FileWriter fileWriter = new FileWriter(new File("C:\\Users\\8888"
                            + "\\Documents\\NetBeansProjects\\Bb\\src\\bb\\cc.txt"))) {
                        fileWriter.write(con.append(temp).toString());
                        fileWriter.flush();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

    }

我的代码只适用于行包含零的情况。如果你想更好地掩盖所有情况,我相信你可以按照我的计划行事。

样本去掉所有的零,比如

1 1 1
0 0 0
0 0 0
1 1 1

代码:

        String s = "xxxooooooxxx";
        String[] sp = s.split("");
        boolean xFlag = false;

        for (int i = 0; i < sp.length; i++) {
            if (sp[i].equals("x") && !xFlag) {
                System.out.print("x");
            } else if (sp[i].equals("o")) {
                xFlag = true;
            } else if (sp[i].equals("x") && xFlag) {
                System.out.print("X");
            }
        }

输出:

xxxXXX
 类似资料:
  • 我有一个非常简单的问题:使用Python从txt文件中读取不同条目的最有效方法是什么? 假设我有一个文本文件,如下所示: 在C中,我会这样做: 用Python做这样的事情最好的方法是什么?以便将每个值存储到不同的变量中(因为我必须在整个代码中使用这些变量)。 提前感谢!

  • 问题内容: 是否可以将JSON数据保存到本地文本文件中?因此,稍后我可以通过加载该文件再次使用它,并取回存储的JSON数据。其实我真正想做的是在文本文件中导出JSON数据,以便以后可以用作import.Any的建议或解决方案? 这是我要用于导出到文本的一些示例。 http://jsfiddle.net/k56eezxp/ 问题答案: 是否可以将JSON数据保存到本地文本文件中? 是。当前,链接的j

  • 问题内容: 我想从一个充满整数的文本文件中读取数据,并让程序在求和时将这些整数打印到屏幕上。这应该不难,但我无法弄清楚!!! 这是极其简化的文本文件: 这是我应该工作的代码: 最后,这是我得到的输出: 问题答案: 您在循环中两次调用textfile.nextInt()。尝试:

  • 问题内容: 我有以下格式的文本文件: Details.txt 该文件是.txt文件。我想从该文件中读取课程标题,并打印相应的教科书和教师信息。但是我不确定该遵循什么程序?将信息存储在数组中效率不高!我应该如何进行?注意:我无法更改文件中的信息,因此不应更改!显然,文件将通过以下代码读取: 但是我应该如何根据课程名称,教科书和讲师的标签从该文件中提取数据! 问题答案: 首先正确地逐行阅读文件,然后搜

  • 必须从文档中检索突出显示的数据。 这是我用来返回页面中的数据的方法,但没有得到用黄色标记的数据,只有那些数据被输入到输出中,而这些数据在word文档的表中没有提到。

  • 我正在尝试从com包中的CSV文件中读取值。实例但当我使用以下语法运行代码时: 上面写着: java.io.FileNotFoundException: Dataset.csv 我也尝试过使用: 仍然不工作。任何帮助都会很有帮助。谢谢