Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按下jButton时如何将数据追加到文件中_Java - Fatal编程技术网

Java 按下jButton时如何将数据追加到文件中

Java 按下jButton时如何将数据追加到文件中,java,Java,我一直在创建一个GUI应用程序,为学生注册数据,数据填写在提供的JTextfields中。按下submit按钮后,我将其编程为以我喜欢的某种方式(安排)将数据存储到文件中。对于第一次提交,程序运行良好,并将数据存储到文件中,但在其他连续的提交中,在此处输入代码(即当学生重新填写时),程序要么覆盖,要么根本不写入文件中。以下是迄今为止的代码: import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; im

我一直在创建一个GUI应用程序,为学生注册数据,数据填写在提供的JTextfields中。按下submit按钮后,我将其编程为以我喜欢的某种方式(安排)将数据存储到文件中。对于第一次提交,程序运行良好,并将数据存储到文件中,但在其他连续的
提交中,在此处输入代码(即当学生重新填写时),程序要么覆盖,要么根本不写入文件中。以下是迄今为止的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;

public class StudentAssignment extends JFrame {
    private JLabel lblFname, lblbSname, lblRegNo, lblPos;
    private JButton btnsubmit;
    private JTextField txtFname, txtSname, txtRegNo, txtPos;
    private JPanel panel1, panel12, panel3, panel4,panel5;
    private int i = 1;
    private File myFile;
    private FileWriter fw;
    private PrintStream ps;


    public StudentAssignment() throws Exception{
        componentInitialization();
        setVisible(true);

        myFile =new File("Mustard.txt");

        fw = new FileWriter(myFile,true);
        ps = new PrintStream(myFile);

        actionListeners();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void componentInitialization(){
        setBounds(200, 200, 300, 300);
        setTitle("Mustard's Frame");
        setLayout(new GridLayout(5,1));

        lblFname = new JLabel("First Name");
        txtFname = new JTextField(10);
        panel1 = new JPanel();
        panel1.add(lblFname); panel1.add(txtFname);

        lblbSname = new JLabel("Surname");
        txtSname = new JTextField(10);
        panel12 = new JPanel();
        panel12.add(lblbSname); panel12.add(txtSname);

        lblRegNo = new JLabel("Registration Number");
        txtRegNo = new JTextField(10);
        panel3 = new JPanel();
        panel3.add(lblRegNo); panel3.add(txtRegNo);

        lblPos = new JLabel("program of study");
        txtPos = new JTextField(10);
        panel4 = new JPanel();
        panel4.add(lblPos); panel4.add(txtPos);

        btnsubmit = new JButton("SUBMIT");
        panel5 = new JPanel();
        panel5.add(btnsubmit);

        add(panel1); add(panel12);
        add(panel3); add(panel4);
        add(panel5);

    }

    public void actionListeners(){

        btnsubmit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)  {

                try {
                    fileStoring();
                }catch (Exception exc){

                }

                clearFields();
            }
        });
    }

    public void fileStoring() throws Exception{

        System.setOut(ps);

        System.out.printf("%-10s %-15s %-15s %-15s %-15s\n", "Sno.", "First Name", "Surname", "Reg.No", "Program of Study");
        System.out.printf("%-10d %-15s %-15s %-15s %-15s\n",i,txtFname.getText(), txtSname.getText(), txtRegNo.getText(), txtPos.getText()  );
        i++;
        fw.close();
        ps.close();
    }

    public void clearFields(){
        txtFname.setText("");
        txtSname.setText("");
        txtRegNo.setText("");
        txtPos.setText("");

        txtFname.requestFocus();
    }

    public static  void  main(String[] args) throws Exception{
        StudentAssignment obj = new StudentAssignment();
    }

}

像这样改变你的方法

public void fileStoring() throws Exception {
        try (FileWriter fileWriter = new FileWriter("C:\\data\\Mustard.txt", true);
                PrintWriter printWriter = new PrintWriter(fileWriter)) {
            if (i == 1) {
                printWriter.printf("%-10s %-15s %-15s %-15s %-15s\n", "Sno.", "First Name", "Surname", "Reg.No",
                        "Program of Study");
            }
            printWriter.printf("%-10d %-15s %-15s %-15s %-15s\n", i, txtFname.getText(), txtSname.getText(),
                    txtRegNo.getText(), txtPos.getText()).toString();
        } catch (IOException e) {
            // handle the exception here.
        }

        i++;
    }
没有得到所需结果的原因是在构造函数中初始化流,然后在第一次写入后关闭流

fw.close();
ps.close();

随后的写入将失败。为了解决这个问题,您需要在每次写入文件时创建一个新流(即,在这个方法本身内部,而不是在构造函数内部),然后关闭它。还请注意,您只需要在开始时编写头文件,而您的实现也无法处理此问题。

它已经成功运行,我非常感谢您的贡献

以下是根据您的建议编辑的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;

public class StudentAssignment extends JFrame {

private JLabel lblFname, lblbSname, lblRegNo, lblPos;
private JButton btnsubmit;
private JTextField txtFname, txtSname, txtRegNo, txtPos;
private JPanel panel1, panel12, panel3, panel4,panel5;
private int i = 1;

public StudentAssignment() throws Exception{
    componentInitialization();
    setVisible(true);
    actionListeners();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void componentInitialization(){
    setBounds(200, 200, 300, 300);
    setTitle("Mustard's Frame");
    setLayout(new GridLayout(5,1));

    lblFname = new JLabel("First Name");
    txtFname = new JTextField(10);
    panel1 = new JPanel();
    panel1.add(lblFname); panel1.add(txtFname);

    lblbSname = new JLabel("Surname");
    txtSname = new JTextField(10);
    panel12 = new JPanel();
    panel12.add(lblbSname); panel12.add(txtSname);

    lblRegNo = new JLabel("Registration Number");
    txtRegNo = new JTextField(10);
    panel3 = new JPanel();
    panel3.add(lblRegNo); panel3.add(txtRegNo);

    lblPos = new JLabel("program of study");
    txtPos = new JTextField(10);
    panel4 = new JPanel();
    panel4.add(lblPos); panel4.add(txtPos);

    btnsubmit = new JButton("SUBMIT");
    panel5 = new JPanel();
    panel5.add(btnsubmit);

    add(panel1); add(panel12);
    add(panel3); add(panel4);
    add(panel5);

}

public void actionListeners(){

    btnsubmit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)  {

            try {
                fileStoring();
            }catch (Exception exc){

            }

            clearFields();
        }
    });
}

public void fileStoring() throws Exception {
    try (FileWriter fileWriter = new FileWriter("Mustard.txt", true);
         PrintWriter printWriter = new PrintWriter(fileWriter)) {
        if (i == 1) {
            printWriter.printf("%-10s %-15s %-15s %-15s %-15s\n", "Sno.", "First Name", "Surname", "Reg.No",
                    "Program of Study");
        }
        printWriter.printf("%-10d %-15s %-15s %-15s %-15s\n", i, txtFname.getText(), txtSname.getText(),
                txtRegNo.getText(), txtPos.getText()).toString();
    } catch (IOException e) {

    }

    i++;
}

public void clearFields(){
    txtFname.setText("");
    txtSname.setText("");
    txtRegNo.setText("");
    txtPos.setText("");

    txtFname.requestFocus();
}

public static  void  main(String[] args) throws Exception{
    StudentAssignment obj = new StudentAssignment();
}

}

为什么要使用
系统放样(ps)?您有一个
打印流
,直接使用即可。在写入文件之前,您还需要重新打开该文件。您真的应该看看Try moving fw=new FileWriter(myFile,true);ps=新的打印流(myFile);到fileStoring()方法的开头。这可能是因为如果你每次使用它们时都重新实例化它们,那么你就关闭了它们work@MadProgrammersetout(ps)将以下代码的整行写入一个文件中(我从某个YouTube来源了解到)。因此,我打算将这两个Sys.out.printf(//代码)写入行中,它在第一次单击按钮时就成功了,但在其他连续的按钮单击时就不起作用了。但无论如何,您标记的资源非常有用。@Abdul razaqTwaha
System.setout(ps)
将您的标准输出流(您用于打印到屏幕上的内容)替换为指定的
PrintStream
,这在最好的情况下是不可取的,但是由于
PrintStream
具有与
System.out.println
相同的功能,这似乎是一种浪费精力和毫无意义的练习,只会破坏将打印语句输出到控制台的可能性,而控制台可用于向用户提供调试信息或提示,但由于您关闭了底层流,它只会破坏底层流API@JRowan我尝试移动它,但问题仍然存在,它现在增加了迭代次数(I++),但数据没有更新。我不应该关闭溪流吗?(数据仅在第一次提交时更新,但在其他提交时未更新)您提供的代码已按我的要求成功运行。我非常感谢您的帮助,先生。@Abdul razaqTwaha您可以投赞成票和/或将其标记为答案,也可以投反对票。这就是我们在这里的做法。仅供参考。