用nextLine()统一读取输入并手动转类型,或在nextInt()后调用nextLine()清缓冲;问卷结果用POJO类+List存储;文件写入启用追加模式;控制台中文乱码需统一UTF-8编码。

如何用 Scanner 实现多轮问卷输入而不阻塞或跳过问题
Java 控制台问卷系统最常卡在 nextLine() 被 nextInt() 或 next() 留下的换行符干扰,导致后续问题直接“跳过”。这不是 Scanner 有 bug,而是它对输入缓冲区的处理逻辑和用户直觉不一致。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 所有输入统一用
nextLine(),哪怕读数字也要后续转类型:String input = scanner.nextLine(); int age = Integer.parseInt(input);
- 如果必须混用
nextInt(),务必在其后加一次scanner.nextLine()消耗残留换行符 - 对选项类问题(如“请输入 1-3”),建议封装校验逻辑,避免用户输错后程序崩溃
怎么结构化保存问卷结果:用 Map 还是自定义类
临时调试可用 Map 存题干→答案,但真实项目中很快会遇到类型混乱、无法扩展、序列化困难等问题。比如年龄存成 "25" 字符串,后续想统计平均值就得反复解析。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 为每份问卷建一个 POJO 类(如
SurveyResponse),字段对应问题,类型明确(int age、boolean agreeToTerms) - 用
List管理多份答卷,便于后续导出 CSV 或转 JSON - 若问题动态变化(如后台配置问卷),再考虑用
Map+ 类型元数据,但需额外做类型安全检查
如何把控制台问卷结果写入文件且不覆盖历史数据
直接用 new FileWriter("data.txt") 默认会清空文件。问卷系统必须追加写入,否则每次运行都丢掉之前所有数据。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 使用带
true参数的构造函数:FileWriter fw = new FileWriter("survey.csv", true); PrintWriter pw = new PrintWriter(fw); - 写入前加时间戳或唯一 ID,避免重复提交被误认为新数据
- CSV 格式比纯文本更易后续分析,注意字段含逗号时用双引号包裹:
"用户反馈, 包含逗号"
为什么 System.out.print() 输出乱码,尤其在 Windows CMD 中
中文显示为问号或方块,根本原因是 CMD 默认编码是 GBK,而 Java 字符串内部是 UTF-16,System.out 在 Windows 上默认按平台编码输出。如果源文件保存为 UTF-8 但未指定编译/运行编码,就会错乱。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 编译时加参数:
javac -encoding UTF-8 SurveyApp.java - 运行时强制指定输出编码:
java -Dfile.encoding=UTF-8 SurveyApp - 更稳妥的做法:不用
System.out直接打印中文,改用PrintWriter显式指定编码写入控制台或文件










