登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
从底层逻辑,谈谈next()和nextLine()配合使用时,出现的 ...
从底层逻辑,谈谈next()和nextLine()配合使用时,出现的“跳过输入”的现象
[ 复制链接 ]
峰埋姚
2025-9-28 18:15:09
点击查看代码
package com.jia.scanner;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接受键盘数据
Scanner sc = new Scanner(System.in);
System.out.println("使用next方式接受:");
//判断用户有没有输入字符串
if (sc.hasNext()){
//使用next方式接受
String str = sc.next();
System.out.println("输出的内容:" + str);
}
System.out.println("============================================");
System.out.println("使用nextLine:");
if (sc.hasNextLine()){
String str = sc.nextLine();
System.out.println("输出的内容:" + str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源,要养成习惯用完就关掉
sc.close();//为了节省资源
}
}
复制代码
这段代码,运行后输出的结果是:
会出现
跳过用户输入的现象
。但是,并不符合我的需求,我希望是在使用nextLine前,可以再次从键盘输入新的内容,再输出新的结果。
接下来,我们可以从输入缓冲区机制和next还有nextLine两种方法的底层处理逻辑进行分析,该现象产生的原因:
数据是在
输入缓冲区
作为“中间站”暂存
计算机在处理键盘输入时,并不是让程序直接“实时”的读取每一个按键,这样效率太低了,而是通过
输入缓冲区
作为中间层:
用户敲击键盘的字符会先存入缓冲区,直到用户按下回车键(\n),缓冲区才会通知程序“有数据可以读取”
程序中的Scanner类本质就是从缓冲区中读取数据,而不是直接从键盘读取
next()方法的底层处理逻辑:
next()的核心逻辑是
以空白字符为分隔符的非空白字符串读取
,具体步骤是:
跳过前导空白字符
:自动忽略缓冲区中开头的所有空白字符(空格、指标符\t、换行符\n等)。
读取有效的字符
:从第一个非空白字符开始读取,持续读取直到遇到
下一个空白字符
(空格、换行等)。
终止但是不消耗分隔符
:当遇到空白字符时,next()会停止读取数据,但是
这个空白字符不会被从缓冲区中移除
,仍然留在缓冲区中。
nextLine()方法的底层处理逻辑:
nextLine()的核心逻辑是
读取一整行内容,知道换行符为止
,具体步骤是:
从当前位置开始读取数据
:不跳过任何字符,直接从缓冲区当前位置开始读取数据。
以换行符为终止符
:持续读取所有字符(包括空白字符),直到遇到\n(换行符)。
消耗终止符
:读取完成后,会将终止的\n(换行符)从缓冲区中移除(即“消耗”掉)。
举例:
用户输入“hello world\n”(\n是用户按回车键产生的换行符),计算机缓冲区的内容为“hello world\n”。
next()执行后:
读取到“hello” (非空白字符开始,知道空格停止);
缓冲区中剩余“ world\n” (空格和后续字符未被消耗移除);
nextLine()执行后:
读取到“ world” (从当前位置,即空格开始,知道\n换行符为止);
同时消耗掉\n(换行符),缓冲区变为空。
综上所述,出现跳过输入现象的根本原因是:
next()读取后,缓冲区中残留了未被消耗掉的空白字符(如空格)和换行符前的字符内容;
后续的nextLine()读取时,会直接从缓冲区这些残留的内容(从空白字符到\n),并消耗掉\n(换行符);
由于执行完next()读取都,缓冲区还有内容(从空白字符到\n)未被消耗,所以,nextLine()无需等待用户输入新内容,导致,看起来出现了“跳过输入现象”。
当然,存在解决方法,只需在next()后额外调用一次nextLine()清空缓冲区,即可。
本质是:
让第一次nextLine()消耗掉next()残留的空白字符和\n,使缓冲区为空。这样,后续真正需要使用nextLine()就会等待用户输入新内容(因为缓冲区已经被清空,必须等待新的\n触发)。
点击查看代码
package com.jia.scanner;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接受键盘数据
Scanner sc = new Scanner(System.in);
System.out.println("使用next方式接受:");
//判断用户有没有输入字符串
if (sc.hasNext()){
//使用next方式接受
String str = sc.next();
sc.nextLine();//紧跟着,使用nextLine释放空格,程序才会接着让用户输入
System.out.println("输出的内容:" + str);
}
System.out.println("============================================");
System.out.println("使用nextLine:");
if (sc.hasNextLine()){
String str = sc.nextLine();
System.out.println("输出的内容:" + str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源,要养成习惯用完就关掉
sc.close();//为了节省资源
}
}
复制代码
该代码运行结果如下:
符合我的需求!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
底层
逻辑
谈谈
next
nextLine
相关帖子
手把手教你在 Sevalla 上部署 Next.js 博客:从搭建到上线全流程
【EF Core】框架底层的数据库连接管理
HarmonyOS Next快速入门:为什么学习HarmonyOS NEXT?
HarmonyOS NEXT仓颉开发语言实现画板案例
PostgreSQL 逻辑复制中的表DDL变更执行步骤
HarmonyOS NEXT仓颉开发语言实战案例:动态广场
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
【渲染管线】UnityURP[渲染路径]底层源码解析
Innodb底层原理与Mysq旧志机制深入剖析
解读 DeepSeek 底层原理, 超复杂(图解+秒懂+史上最全)
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
手把手教你在 Sevalla 上部署 Next.js 博客:从搭建到上线全流程
0
514
抽厉
2025-09-24
业界
【EF Core】框架底层的数据库连接管理
0
992
巴沛若
2025-09-24
业界
HarmonyOS Next快速入门:为什么学习HarmonyOS NEXT?
0
802
何玲
2025-09-24
业界
HarmonyOS NEXT仓颉开发语言实现画板案例
0
757
扎先
2025-09-25
安全
PostgreSQL 逻辑复制中的表DDL变更执行步骤
0
820
赀倦
2025-09-25
业界
HarmonyOS NEXT仓颉开发语言实战案例:动态广场
0
136
崔瑜然
2025-09-25
业界
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
0
928
蝙俚
2025-09-28
业界
【渲染管线】UnityURP[渲染路径]底层源码解析
0
739
讲怔
2025-09-28
安全
Innodb底层原理与Mysq旧志机制深入剖析
0
751
椎蕊
2025-09-30
安全
解读 DeepSeek 底层原理, 超复杂(图解+秒懂+史上最全)
0
434
旌磅箱
2025-10-05
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
峰埋姚
2025-9-28 18:15:09
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
3934307807
993690
4
富账慕
10007
5
柴古香
9992
6
匝抽
9986
7
筒濂
9983
8
孙淼淼
9992
9
凌彦慧
9985
10
崔瑜然
9984
查看更多