Java如何将用户输入的人员信息先临时存入ArrayList再持久化到文件
现有代码的直接缺口
- 完成Person对象的属性赋值后,未将实例加入ArrayList集合,临时存储链路完全缺失
- 未编写任何本地文件写入逻辑,持久化步骤无对应实现
- 存在Scanner输入缓冲区残留隐患:连续调用
nextInt()读取整数后,输入流会遗留换行符,后续触发字符串读取时会直接读空值
完整实现步骤
1. 补全集合存储逻辑
在给Person对象的所有属性赋值完成后,执行add操作将实例存入ArrayList,示例代码片段:
// 初始化集合、Scanner输入流、Person实例 ArrayList<Person> info = new ArrayList<>(); Scanner input = new Scanner(System.in); Person person = new Person(); // 采集信息赋值 System.out.println("What is Your Name ? "); person.setName(input.nextLine()); System.out.println("Please Enter Your Age: "); person.age = input.nextInt(); System.out.println("Please Enter Your Weight: "); person.weight = input.nextInt(); // 吃掉nextInt残留的换行符,避免下一轮读取姓名时读空 input.nextLine(); // 核心:将赋值完成的Person对象存入集合 info.add(person);
2. 实现ArrayList到本地文件的持久化
根据存储需求可以选择两种常用实现方案:
方案1:文本格式存储(可读性强,支持人工打开查看)
用字符流将集合内的每个用户信息按行写入本地文件,每行格式为姓名,年龄,体重,代码实现:
// try-with-resources 自动关闭流,无需手动释放资源 try (BufferedWriter writer = new BufferedWriter(new FileWriter("user_info.txt", true))) { // 遍历集合内的所有Person对象 for (Person p : info) { // 拼接一行用户信息 String line = String.join(",", p.getName(), String.valueOf(p.age), String.valueOf(p.weight)); writer.write(line); writer.newLine(); // 写入换行符,区分不同用户的信息 } System.out.println("信息已成功持久化到本地文件"); } catch (IOException e) { e.printStackTrace(); System.out.println("文件写入失败,请检查本地文件权限"); }
注意:上述
FileWriter的第二个参数true表示追加写入,不会覆盖文件内已有的历史数据;如果需要每次写入都覆盖旧文件,删除该参数即可。
方案2:Java原生对象序列化存储(读取时可直接还原Person对象)
如果后续需要把文件里的内容直接读回成Person对象,可以用序列化方式存储。注意:Person类必须实现Serializable标记接口,否则会抛出序列化异常
代码实现:
// Person类需先添加实现:public class Person implements Serializable { ... } try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user_info.dat"))) { // 直接把整个ArrayList对象写入文件 oos.writeObject(info); System.out.println("集合对象已成功序列化到本地文件"); } catch (IOException e) { e.printStackTrace(); }
常见踩坑提醒
- 不要在给Person属性赋值前就把对象加入集合:此时对象的属性都是默认初始值(name为null,age/weight为0),存入集合的就是无效数据
- 因为Person类的name是私有访问权限,外部无法直接读取,需要在Person类中补充
getName()方法,否则文本存储时无法获取姓名属性值 - 序列化存储时,Person类如果新增/删除字段,需要手动指定
serialVersionUID,否则反序列化时会报版本不一致的错误 - 写入文件时如果出现权限报错,检查程序的运行路径是否有文件写入权限,或者换用用户目录下的绝对路径存储文件
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

