java中用try-with-resources配合scanner读取文本,核心是自动关闭资源防泄漏,需显式指定编码读文件、用string构造scanner解析变量,但绑定system.in时禁用自动关闭以免中断输入。

必须用 try-with-resources 管理 Scanner
Scanner 实现了 AutoCloseable 接口,声明在 try 括号内即可自动调用 close()。不用手动 close,也不用写 finally 块。
不这么做容易导致:
- 文件句柄未释放,后续读写失败
- 大文件反复打开不关,触发“Too many open files”错误
- 控制台输入流被意外关闭(仅限 System.in 场景,见下文特别提醒)
读取文件:带编码防乱码
从磁盘读文本时,务必显式指定字符集,否则默认平台编码(如 Windows 的 GBK)可能把 UTF-8 文件读成乱码。
推荐写法:
try (Scanner sc = new Scanner(new File("data.txt"), StandardCharsets.UTF_8)) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
System.out.println(line);
}
}
注意:不要传入 "UTF-8" 字符串字面量,而要用 StandardCharsets.UTF_8 —— 更类型安全,且避免拼写错误或异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
解析字符串变量:轻量高效
当已有文本内容(比如日志片段、配置字符串),直接用 String 构造 Scanner,无需 IO 流:
String raw = "apple,2.5,red
banana,1.8,yellow";
try (Scanner sc = new Scanner(raw)) {
sc.useDelimiter("\s*,\s*|\n"); // 同时支持逗号和换行分隔
while (sc.hasNext()) {
System.out.print(sc.next() + " | ");
}
}
这种用法适合单元测试、配置提取、日志字段切分等场景,开销极小。
特别注意 System.in 的陷阱
如果 Scanner 绑定的是 System.in(比如从键盘读用户输入),绝不能在 try-with-resources 中自动关闭它。
原因:close() 会关闭底层 InputStream,导致后续所有 System.in 操作失效(整个程序再也读不到键盘输入)。
正确做法是:不用 try-with-resources,手动控制生命周期,或在确定不再需要输入时才 close(通常不 close 更稳妥):
Scanner sc = new Scanner(System.in); // ... 正常读取 // sc.close(); // 不建议调用,除非明确知道后果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










