Java中如何让ArrayList保留历次控制台输入的内容?
问题解答
当前的代码无法实现跨运行保存ArrayList内容。
原因
Java程序每次启动都会创建全新的JVM进程,静态集合listNames和listIds仅存在于当前进程的内存中。当程序运行结束、进程退出后,内存中的所有数据会被释放,下次启动程序时会重新初始化这两个空集合,因此只能保留本次运行的输入内容。
解决方法
要实现跨运行保存数据,必须将数据持久化到磁盘(比如文件、数据库),每次程序启动时先从持久化介质加载历史数据,新增数据后再写回介质。下面是基于文件持久化的修改示例:
import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class User { // 定义持久化文件路径 private static final String DATA_FILE = "user_data.txt"; private static List<String> listNames = new ArrayList<>(); private static List<Integer> listIds = new ArrayList<>(); // 用户字段 private int ID; private String name; public static void main(String[] args) { // 启动时加载历史数据 loadDataFromFile(); int tempID = 5000; if (args.length > 0) { tempID = Integer.parseInt(args[0]); } System.out.println("Login " + tempID); Scanner scanner = new Scanner(System.in); System.out.print("Enter your Name : "); String tempName = scanner.nextLine(); User n = new User(); n.ID = tempID; n.name = tempName; listIds.add(n.ID); listNames.add(n.name); // 保存更新后的数据到文件 saveDataToFile(); // 验证:打印当前所有数据 System.out.println("当前所有用户数据:"); for (int i = 0; i < listIds.size(); i++) { System.out.printf("ID: %d, Name: %s%n", listIds.get(i), listNames.get(i)); } } // 从文件加载数据 private static void loadDataFromFile() { File file = new File(DATA_FILE); if (!file.exists()) { return; } try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line; while ((line = reader.readLine()) != null) { // 按逗号分隔ID和Name String[] parts = line.split(","); if (parts.length == 2) { listIds.add(Integer.parseInt(parts[0])); listNames.add(parts[1]); } } } catch (IOException e) { e.printStackTrace(); } } // 将数据写入文件 private static void saveDataToFile() { try (BufferedWriter writer = new BufferedWriter(new FileWriter(DATA_FILE))) { for (int i = 0; i < listIds.size(); i++) { writer.write(listIds.get(i) + "," + listNames.get(i)); writer.newLine(); } } catch (IOException e) { e.printStackTrace(); } } }
说明
- 程序启动时会读取
user_data.txt文件中的历史数据,加载到集合中 - 新增用户数据后,会把所有用户数据(历史+新增)写入文件
- 每次运行程序,都会保留之前所有输入的内容
内容的提问来源于stack exchange,提问作者LittleLamb
相关产品推荐
相关产品推荐

