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
相关产品推荐
相关产品推荐

