StreamTokenizer 控制台输入的 EOF 终止问题详解
发布时间 - 2025-12-29 00:00:00 点击率:次使用 `streamtokenizer` 从控制台读取数字时,若未显式触发 eof(linux/macos 按 ctrl+d,windows 按 ctrl+z),循环将无限等待输入,导致程序“卡住”——这并非 bug,而是流未关闭的正常行为。
StreamTokenizer 本身不主动检测“用户是否输完了”,它严格依赖底层输入流的结束信号(即 EOF)。当使用 System.in(标准输入)时,该流默认永远不会自动关闭——它持续等待用户键入内容,直到你手动发送 EOF 信号。这就是为什么示例中看似相同的 while (st.nextToken() != st.TT_EOF) 循环,在一个输出语句存在时“似乎能退出”,而另一个仅做 add() 操作时却陷入无限等待:根本原因不是代码逻辑差异,而是你尚未向终端发送 EOF,程序始终阻塞在 st.nextToken() 上。
✅ 正确操作流程(以 Linux/macOS 为例):
- 运行程序;
- 输入若干整数,每数一行或空格分隔(如 12 34 56);
- 按 Ctrl+D(非 Ctrl+C!) —— 这会向 System.in 发送 EOF;
- 循环立即退出,后续代码(如 System.out.print(a))执行。
⚠️ Windows 用户注意:需在新行开头按 Ctrl+Z + 回车(单独 Ctrl+Z 可能无效);若在数字后直接按 Ctrl+Z,部分终端可能忽略,建议换行后再触发。
? 修正后的可靠代码示例:
import java.io.*;
import java.util.ArrayList;
public class pr_23 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer st = new StreamTokenizer(br);
st.parseNumbers(); // 显式声明解析数字(推荐,增强健壮性)
ArrayList numbers = new ArrayList<>();
int token;
while ((token = st.nextToken()) != StreamTokenizer.TT_EOF) {
if (token == StreamTokenizer.TT_NUMBER) {
numbers.add((int) st.nval);
}
// 忽略非数字令牌(如空格、换行),避免类型误判
}
System.out.println("Parsed numbers: " + numbers);
br.close();
}
} ? 关键要点总结:
- StreamTokenizer 的 nextToken() 是阻塞式调用,无输入则挂起,不超时、不抛异常;
- 控制台输入流 System.in 的 EOF 必须由用户显式触发,IDE 内置终端(如 IntelliJ Console)通常支持 Ctrl+D/Z,但某些图形终端需配置;
- 不要依赖“输入空行”或“输入特定字符串(如 ‘quit’)”来退出——StreamTokenizer 默认将字母视为单词(TT_WORD),需额外处理,反而增加复杂度;
- 若需更友好的交互体验(如支持命令退出),建议改用 Scanner(例如 while (scanner.hasNextInt())),但若教学或兼容性要求必须用 StreamTokenizer,请务必牢记 EOF 手动触发机制。
掌握这一机制,你就能准确区分“程序卡死”与“流等待输入”的本质差异,真正理解 Java I/O 的底层契约。
# linux
# word
# java
# windows
# mac
# ai
# macos
# win
# stream
# cos
# 为什么
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何选择可靠的免备案建站服务器?
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
网站制作价目表怎么做,珍爱网婚介费用多少?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何用低价快速搭建高质量网站?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
EditPlus中的正则表达式实战(5)
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
详解Huffman编码算法之Java实现
微信小程序 input输入框控件详解及实例(多种示例)
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Python结构化数据采集_字段抽取解析【教程】
教你用AI将一段旋律扩展成一首完整的曲子
制作电商网页,电商供应链怎么做?
香港网站服务器数量如何影响SEO优化效果?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何用PHP工具快速搭建高效网站?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
如何构建满足综合性能需求的优质建站方案?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
如何在IIS中新建站点并解决端口绑定冲突?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
简单实现Android验证码
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
如何在阿里云通过域名搭建网站?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
高防服务器租用指南:配置选择与快速部署攻略
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
创业网站制作流程,创业网站可靠吗?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel如何为API编写文档_Laravel API文档生成与维护方法
英语简历制作免费网站推荐,如何将简历翻译成英文?


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer st = new StreamTokenizer(br);
st.parseNumbers(); // 显式声明解析数字(推荐,增强健壮性)
ArrayList