ArrayList比String[]更适合实现留言板,因其动态扩容、自带增删查方法;应封装Message对象、用BufferedWriter/BufferedReader持久化、Scanner统一用nextLine()防空行、拆分MessageService和IOUtils提升可维护性。

用 ArrayList 存留言,别用数组硬编码
控制台留言板本质是“增删查”操作频繁的文本数据集合,ArrayList 比 String[] 更合适——动态扩容、自带 add()/remove()/get(),不用手动管理下标越界。常见错误是初始化时写死容量(如 new ArrayList(10)),其实留空构造即可,内部扩容策略已足够高效。
注意点:
- 存留言建议封装为对象(如
Message类),含content、timestamp、id字段,避免用ArrayList存纯文本——后续加作者、时间、状态等字段会极难扩展 - 如果要求按时间倒序显示,插入时不用排序,查时用
Collections.reverse()或遍历时从后往前,比每次add(0, msg)性能好 - 清空全部留言别用循环
remove(),直接调list.clear()
用 BufferedWriter 和 BufferedReader 做持久化,别碰 FileWriter 直写
程序退出后留言不丢,必须落盘。直接用 FileWriter 写字符串易出乱码、换行不一致、异常时文件残留脏数据;BufferedWriter 提供 newLine() 和自动缓冲,配合 try-with-resources 能确保流关闭。
典型写法:
立即学习“Java免费学习笔记(深入)”;
try (BufferedWriter bw = new BufferedWriter(new FileWriter("messages.txt", true))) {
bw.write(message.toString());
bw.newLine();
}
读取时同理,用 BufferedReader.readLine() 逐行解析,每行反序列化成 Message 对象。注意:
- 文件路径别写绝对路径(如
C:\\data\\messages.txt),用相对路径或Paths.get("messages.txt") - 追加写入用
FileWriter(file, true),漏掉true会覆盖全量 - 如果留言含中文,显式指定编码:
new OutputStreamWriter(new FileOutputStream(...), StandardCharsets.UTF_8)
控制台交互用 Scanner,但要防 nextLine() 吃空行
用户输入菜单编号、留言内容都靠 Scanner,但混合用 nextInt() 和 nextLine() 是高频翻车点:前者不读换行符,后者立刻读到空字符串。最稳做法是统一用 nextLine(),再对数字输入做 Integer.parseInt() 转换。
示例逻辑:
System.out.print("请选择操作(1-添加,2-查看,0-退出):");
String choice = scanner.nextLine().trim();
if ("1".equals(choice)) {
System.out.print("请输入留言:");
String content = scanner.nextLine().trim();
// ... 添加逻辑
}
其他要点:
- 输入为空时提前校验(
content.isEmpty()),避免存空消息 - 菜单循环别用
while(true)+break,改用boolean running = true;+running = false;,语义更清晰 - 异常输入(如输字母选菜单)捕获
NumberFormatException并提示重输,别让程序崩
项目结构别堆在 Main 类里,至少拆出 MessageService 和 IOUtils
所有逻辑塞进一个 Main.java 文件,后期加搜索、分页、用户权限就彻底不可维护。哪怕只有两个类,也值得拆:
-
MessageService:专注业务,如addMessage()、getAllMessages()、deleteById() -
IOUtils:只管文件读写,如saveToFile(List、) loadFromFile(),不碰控制台输出
这样做的实际好处:
- 单元测试能单独测
MessageService,不用启动控制台模拟输入 - 将来换成数据库,只需重写
IOUtils,业务逻辑几乎不动 - 多人协作时,一人改 IO,一人改交互,互不干扰
真正难的不是写完功能,而是下次加“按关键词搜索留言”时,你能不能在 5 分钟内定位到该改哪几个方法——结构松散的代码,连自己都会忘记当初为什么那样写。










