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. json.dumps错误:'utf8' codec can't decode byte解决方案

    一次在使用json.dumps()过程中,出现错误提示: ERROR:"UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in ...

  2. STL Allocator

    从上面这个程序可以看出,我们这里手动使用了分配器,分配器有很多种类,有std::,还有非std::,也就是上面的__gnu_cxx下面的,我们在使用容器的时候不关心我们使用什么分配器,也不关心我们如何 ...

  3. 有关于PHP的基础知识

    (1) l  长字符串表示,必须放在“<<<heredoc”和 “heredoc;”之间.主要是<<<,其次是也可以不使用heredoc. l  “<< ...

  4. 多个jar包的合并

    1.将所有jar文件复制至某临时目录中,通过jar命令解压得到所有的.class文件 > jar -xvf xx.jar xx.jar必须为具体的jar,不能为*.jar,会报FileNotFo ...

  5. Anaconda使用入门

    简介 Conda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换 Anaconda包括Conda.Python以及一大堆安装好的工具包,比如: ...

  6. AGC018C Coins (set)

    题目大意: 给出n个人,每个人手里都有xi个金牌,yi个银牌,ci个铜牌. 你需要选出X个人,拿走他们手里的金牌,选出Y个人,拿走他们手里的银牌,选出Z个人,拿走他们手里的铜牌 X+Y+Z = n.并 ...

  7. 【NOIP模拟赛】飞(fly) 数论+树状数组

    树状数组一个被发明以来广为流行的数据结构,基于数组,核心是lowerbit()操作.他向前lowerbit()操作为前缀,向后lowerbit()操作为上辖,我们运用树状数组都是使一个由O(1)变为O ...

  8. [poj 1743]差分+后缀数组

    题目链接:http://poj.org/problem?id=1743 首先,musical theme只与前后位置的增减关系有关,而与绝对的数值无关,因此想到做一次差分. 然后对于差分后的数组,找到 ...

  9. java禁止实例化的工具类

    public class Q { /** * @param args */ public static void main(String[] args) { new Person() } } clas ...

  10. nginx 设置ip地址访问,但是设置域名访问不了

    一.导语 在Nginx的设置过程中,ip地址能正常访问的,但是把ip地址转换成域名,就访问不了了,这个是怎么回事呢?今天来探讨一下 二.设置ip地址做负载均衡 2.1.server端 server { ...