You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java File处理问题:如何向文件追加文本及修复诊所管理系统文件不生成故障

代码错误清单
  • 核心问题:自定义的文件写入方法ToFile从未被调用,无论是用户点击提交按钮还是程序关闭时都没有触发执行逻辑,自然不会生成文件
  • 方法定义错误:ToFile方法的参数存在拼写、语法问题:Arraylist拼写错误(正确为ArrayList),泛型声明缺失,传入的filename、data参数完全未被使用,方法内硬编码了文件路径
  • 语法错误:FileWriter构造时使用了Java不支持的参数名:值写法,new FileWriter(filename: "accounts.txt",append: true)属于非法语法
  • 导入错误:import java.awt.event.ActionListen拼写错误,缺少末尾的er,正确应为ActionListener
  • 写入内容格式问题:写入时没有添加换行符,所有内容会挤在同一行,可读性差
  • 拼写错误:实体类名Pateint应为Patient,若你本地已定义该类注意保持拼写一致
修正后可运行代码
import java.awt.event.ActionEvent;             
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.Color;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

// 与原代码拼写保持一致,建议后续修正为Patient
class Pateint {
    public String name;
    public String phone;
    public String address;
    public String diseaseDesc;
    public String appointmentDate;
    public int id;

    public Pateint(String name, String phone, String address, String diseaseDesc, String appointmentDate, int id) {
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.diseaseDesc = diseaseDesc;
        this.appointmentDate = appointmentDate;
        this.id = id;
    }
}

public class Management extends JFrame implements ActionListener{

    private ImageIcon image;
    private static final long serialVersionUID = 1L;
    private JTextField jt1, jt2, jt3, jt4;
    private JLabel jl1, jl2, jl3, jl4, jl5, jl6;
    private JButton jb1, jb2, jb3;
    private JTextArea ja1;
    private ArrayList<Pateint> data = new ArrayList<>();
    private int find;
    private int x=0;
    private final JLabel label = new JLabel("New label");

    public Management(){
        label.setBackground(Color.GRAY);

        JLabel background;
        setSize(1200,700);
        setLocationRelativeTo(null);
        // 1.jpg不存在仅影响背景加载,不影响核心逻辑
        image = new ImageIcon("1.jpg");
        background  = new JLabel("",image,JLabel.CENTER);
        background.setBounds(0,0,1200,700);
        getContentPane().add(background);
        setContentPane(new JLabel(new ImageIcon("1.jpg")));
        setTitle("Clinic Management System");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        jl1 = new JLabel("Please select one Option");
        jl1.setBounds(400, 270, 200,30);
        jt1 = new JTextField();
        jt1.setVisible(false);

        jt1.setBounds(200,200, 300,30);
        getContentPane().add(jl1);
        getContentPane().add(jt1);

        jb1 = new JButton("Book An Appointment");
        jb1.setBounds(300,300,200,200);
        getContentPane().add(jb1);

        jb2 = new JButton("View Pateints Record");
        jb2.setBounds(540, 300, 200, 200);
        getContentPane().add(jb2);

        jl2 = new JLabel("Enter Pateints Name:");
        jl2.setBounds(200, 170, 200, 30);
        getContentPane().add(jl2);
        jl2.setVisible(false);

        jl3 = new JLabel("Enter Phone number");
        jl3.setBounds(200, 250, 200,30);
        jl3.setVisible(false);
        getContentPane().add(jl3);

        jt2 = new JTextField();
        jt2.setBounds(200, 290, 300,30);
        jt2.setVisible(false);
        getContentPane().add(jt2);

        jt3 = new JTextField();
        jt3.setBounds(200, 360, 300,30);
        jt3.setVisible(false);
        getContentPane().add(jt3);

        jl4 = new JLabel("Enter Pateints Address: ");
        jl4.setBounds(200, 330, 200, 30);
        jl4.setVisible(false);
        getContentPane().add(jl4);

        ja1 = new JTextArea();
        ja1.setBounds(600, 200, 400, 200);
        ja1.setVisible(false);
        getContentPane().add(ja1);

        jl5 = new JLabel("Please Enter Description about your Disease");
        jl5.setBounds(600, 170, 300, 30);
        jl5.setVisible(false);
        getContentPane().add(jl5);

        jt4= new JTextField();
        jt4.setVisible(false);
        jt4.setBounds(600, 480, 300, 30);
        getContentPane().add(jt4);

        jl6 = new JLabel("Enter Date of appointment DD/MM/YYYY");
        jl6.setBounds(600, 450, 300, 30);
        jl6.setVisible(false);
        getContentPane().add(jl6);

        jb3 = new JButton("Submit");
        jb3.setBounds(500, 550, 100,30);
        jb3.setVisible(false);
        getContentPane().add(jb3);

        jb1.addActionListener(this);
        jb2.addActionListener(this);
        jb3.addActionListener(this);
        setVisible(true);
        
        // 添加程序关闭钩子,退出时自动写入全量数据做双保险
        Runtime.getRuntime().addShutdownHook(new Thread(this::writeAllDataToFile));
    }


    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource()==jb1){
            jb1.setVisible(false);
            jb2.setVisible(false);
            jl1.setVisible(false);

            jt1.setVisible(true);
            jl2.setVisible(true);
            jt2.setVisible(true);
            jl3.setVisible(true);
            jl4.setVisible(true);
            jt3.setVisible(true);
            ja1.setVisible(true);
            jl5.setVisible(true);
            jt4.setVisible(true);
            jl6.setVisible(true);
            jb3.setVisible(true);
            // 清空上次输入残留
            jt1.setText("");
            jt2.setText("");
            jt3.setText("");
            ja1.setText("");
            jt4.setText("");
        }
        else if(ae.getSource()==jb2){
            jb1.setVisible(true);
            jb2.setVisible(true);
            jl1.setVisible(true);
            try {
                find = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter Pateint's ID"));
                for(int i=0; i<data.size(); i++){
                    if(find==data.get(i).id){
                        JOptionPane.showMessageDialog(null, "Name : "
                                + data.get(i).name + " \nPhone : " + data.get(i).phone + "\nI.D : " +
                                data.get(i).id + "\nAppointment Date: " + data.get(i).appointmentDate);
                        break;
                    }
                }
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(null, "请输入合法的数字ID");
            }
        }
        else if(ae.getSource()==jb3){
            jb1.setVisible(true);
            jb2.setVisible(true);
            jl1.setVisible(true);

            jb3.setVisible(false);
            jt1.setVisible(false);
            jl2.setVisible(false);
            jt2.setVisible(false);
            jl3.setVisible(false);
            jl4.setVisible(false);
            jt3.setVisible(false);
            ja1.setVisible(false);
            jl5.setVisible(false);
            jt4.setVisible(false);
            jl6.setVisible(false);
            Pateint newPateint = new Pateint(jt1.getText(), jt2.getText(), jt3.getText(), ja1.getText(), jt4.getText(), x+1);
            data.add(newPateint);
            x++;
            // 提交后立刻写入单条数据,避免异常退出丢失数据
            writeSingleDataToFile(newPateint);
        }
    }

    // 提交时写入单条数据
    public void writeSingleDataToFile(Pateint pateint)
    {
        // try-with-resources自动关闭IO流,无需手动调用close
        try (BufferedWriter buffWrite = new BufferedWriter(new FileWriter("accounts.txt",true))) {
            buffWrite.write("===== 患者ID:"+pateint.id +" =====\n");
            buffWrite.write("患者姓名:"+pateint.name +"\n");
            buffWrite.write("联系电话:"+pateint.phone +"\n");
            buffWrite.write("家庭地址:"+pateint.address +"\n");
            buffWrite.write("病情描述:"+pateint.diseaseDesc +"\n");
            buffWrite.write("预约日期:"+pateint.appointmentDate +"\n\n");
        }
        catch(IOException e) {
            System.out.println("文件写入失败:" + e.getMessage());
        }
    }

    // 程序关闭时写入全量数据
    public void writeAllDataToFile() {
        try (BufferedWriter buffWrite = new BufferedWriter(new FileWriter("accounts_all.txt"))) {
            for (Pateint pateint : data) {
                buffWrite.write("===== 患者ID:"+pateint.id +" =====\n");
                buffWrite.write("患者姓名:"+pateint.name +"\n");
                buffWrite.write("联系电话:"+pateint.phone +"\n");
                buffWrite.write("家庭地址:"+pateint.address +"\n");
                buffWrite.write("病情描述:"+pateint.diseaseDesc +"\n");
                buffWrite.write("预约日期:"+pateint.appointmentDate +"\n\n");
            }
        } catch (IOException e) {
            System.out.println("全量数据写入失败:" + e.getMessage());
        }
    }

    public static void main(String[] args) {
        new Management();
    }
}
核心修改说明
  • 在提交按钮的点击逻辑中新增了单条数据写入方法调用,提交后立刻写入文件,避免异常退出数据丢失
  • 新增了JVM关闭钩子,程序正常退出时会自动写入全量数据到accounts_all.txt做双保险
  • 修正了所有语法、拼写错误,补充了Pateint实体类的定义,使用try-with-resources自动管理IO流
  • 新增了输入异常捕获,避免用户输入非数字ID导致程序崩溃
  • 优化了文件写入格式,添加了分隔符和换行,方便后续查看
  • 补充了主方法,可直接运行启动程序

内容的提问来源于stack exchange,提问作者Shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:54:02