Scanner类读取键盘输入(java中Scanner类nextLine()和next()的区别和使用方法&&java 中的Scanner(非常详细不看后悔)):

2017/3/18 在使用这个类时一直有个疑惑,我不明白这个类读取输入是怎么判断输入结束的...., 今天使用时一直在读取命令行的输入,像个智障一样. 感觉还是没有搞明白这个类的具体用法,现在来分析一番

import java.util.Scanner;

class Shuchu{
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名:"+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
}
}

上面的代码运行的结果如下:

可以看到 Scanner sc = new Scanner(System.in); 这里并没有造成线程等待,我原来以为会 等待键盘的输入,有意思的是在 String name = sc.nextLine() 这里它在等待键盘的输入, 并且遇到enter键时判断输入结束...,  由此推断出来的结论是 Scanner sc = new Scanner(System.in) 这里 只是实例化了一个以键盘输入为数据源的Scanner对象而已, 还没有开始使用这个玩意儿. 真正使用它的是调用它的一系列next方法, 此时才从键盘读取输入并根据不同的输入符号来判断输入是否结束.比如nextLine()方法就是 遇到 回车 时判断输入结束,返回当前行的其余部分, 不包括结尾处的行分隔符,当前位置移至下一行的行首. nextInt()方法将输入信息的下一个标记扫描为一个 int, 遇到回车返回当前行, 当前位置移至下一行的行首.其余的nextFloat(), nextString() 方法同理.

有两个方法值得注意定位是:hasNext()和next().hasNext()方法的作用是让Scanner从命令行读取输入,还是以回车结束(准确的说是遇到回车返回当前行). 类似其余的next() 方法, 只不过返回值是Boolean型, 而一般的nextXX()方法返回的是键盘的输入值, 可以利用这个方法来从键盘循环读取输入, 不过会造成无限循环, 会一直从键盘读取输入....汗..., 这个时候按 ctrl+C 结束输入. 注意,这是输入,而不是对控制台进行操作。这相当于向控制台输入一个字符,这个字符代表EOF,此时hasNext()方法返回false,循环结束。如果是 sc.hasNext()方法的话, 键盘的输入全部都读到sc里去了(包括回车), 并且当前位置并未移动, 然后再 sc.next()方法的话便可以返回sc里的内容, 同样的会遇到回车符, 然后返回当前行. next()方法默认以空格符号作为输入多个词的空格符, 意思就是 如果在.hasNext()方法输入的是 “11 11 11回车” 的话, next()方法返回的是:

  11

后面两个11 并未返回.

注意nextInt()方法和next()方法默以空格分割(我估计其余的nextXXX()方法也是这样,当然默认分割符号可以改), 所以会出出现下面的情况:


至此,总算是搞明白了Scanner这个类的一些用法了, 回答我开始的问题顺便总结下:

1. 判断输入结束--- 与其说是判断输入结束倒不如说是 遇到特定符号返回当前输入, 默认是enter回车符号.

2. 大致过程是 Scanner对象先读取输入, 然后用个当前位置标记一样的东西, 利用nextXXX() 方法从开始往后面扫描, 返回扫描的内容,移动标记位置.  nextLine() 扫描到回车键为止, 返回当前行, 当前位置移至下一行的行首.  nextInt()方法将扫面到的内容标记为int 遇到分割符或者回车符返回, 移动位置标记. 此后再调用nextXXX()方法便在当前的位置标记基础上,继续往后扫描.

以上个人揣测部分太多......, 如果有错误的话希望大家指点指点下, 共同学习共同进步哈.

Scanner类的个人分析的更多相关文章

  1. java中scanner类的用法

    在Eclipse中编写程序时,如果我们的变量是需要手动输入的时候,我们就可以用到scanner类了. Scanner类,这是一个用于扫描输入文本的新的实用程序.由于任何数据都必须通过同一模式的捕获组检 ...

  2. Java API ——Scanner类

    1.Scanner类概述 JDK5以后用于获取用户的键盘输入,一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器.Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空 ...

  3. Scanner类、Random类、ArrayList 类

    1.1 什么是Scanner类一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 System.in 中读取一个数: Scanner sc = new Scanner(Syst ...

  4. Java中的引用类型Scanner类和随机类型Random

    Scanner类 我们要学的Scanner类是属于引用数据类型,我们先了解下引用数据类型.   引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. ...

  5. 12-01 Java Scanner类,Scanner类中的nextLine()产生的换行符问题

    分析理解:Scanner sc = new Scanner(System.in); package cn.itcast_01; /* * Scanner:用于接收键盘录入数据. * * 前面的时候: ...

  6. 交互程序 Scanner类

    交互程序 1. Scanner类是标准Java类库的类 (1)提供一些方法用于交互式读入不同类型的输入数据,输入可以是不同的数据源,包括用户键入的数据和保存在文件中的数据(怎么弄). (2)将一个字符 ...

  7. 01 语言基础+高级:1-3 常用API第一部分_day07【Scanner类、Random类、ArrayList类】

    day07[Scanner类.Random类.ArrayList类] Scanner类Random类ArrayList类 教学目标 能够明确API的使用步骤能够使用Scanner类获得键盘录入数据能够 ...

  8. Scanner 类

    Java Scanner 类 java.util.Scanner 是 Java5的新特征,我们可以通过 Scanner 类来获取用户的输入. 基本语法: Scanner sc = new Scanne ...

  9. Scanner类

    Scanner类:用于获取用户的键盘输入 成员方法: public boolean hasNextXxx():判断是否某种类型的元素 public Xxx nextXxx():获取该元素 常用方法: ...

随机推荐

  1. python 注册表重置ie代理 ss使用后的代理恢复

    每次用完ss客户端,浏览器代理都不会改回来,不想手动改,只能用python脚本处理了. import winreg def disableProxy(): proxy = "" x ...

  2. winform自动最大化(在不同分辨率情况下)

    load函数末尾加: System.Drawing.Rectangle rec = Screen.GetWorkingArea(this); int SH = rec.Height; int SW = ...

  3. [剑指Offer] 43.左旋转字符串

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  4. oracle或mysql定时增量更新索引数据到Elasticsearch

    利用kettle Spoon从oracle或mysql定时增量更新数据到Elasticsearch https://blog.csdn.net/jin110502116/article/details ...

  5. 【BZOI 1202 狡猾的商人】

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4149  Solved: 1994[Submit][Status][Discuss] Descript ...

  6. 【NOIP模拟赛】Drink 二维链表+模拟

    我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過.這道題的主體思路就是把原來旋轉點的O(n^2)變成了旋轉邊界的O(n).怎麼旋轉邊界呢,就好像是把原來的那些點都於上下左右四個點連線, ...

  7. vector创建2维数组

    以前我要建立一个二维数组,总是使用 int N=5, M=6; vector<vector<int> > Matrix(N); for(int i =0; i< Matr ...

  8. 使用Spring AOP实现读写分离(MySql实现主从复制)

    1.  背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案,其中一个是主库,负责写入数据,我们称之为:写库: 其它都是从库,负责读 ...

  9. Linux下文件解压命令

    1.压缩命令: 命令格式:tar -zcvf 压缩文件名.tar.gz 被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar -zxvf 压缩 ...

  10. 调整文本输入框placeholder的颜色等样式

    input::-webkit-input-placeholder{     color: white !important;}input:-moz-placeholder{    color: whi ...