Java Scanner 类

java.util.Scanner 是 Java5的新特征,我们可以通过 Scanner 类来获取用户的输入。

基本语法:

Scanner sc = new Scanner(System.in);

通过Scanner类的next()或nextLine()方法获取输入的字符串, 在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据:

next() 与 nextLine() 区别

next():

  • 一定要读取到有效字符后才可以结束输入。
  • 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

nextLine():

  • 以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。

  • 可以获得空白。

使用 next 方法:

import java.util.Scanner;

public class ScannerDemo {
public static void main(String[] args) {
//首先创建一个扫描器,用于接收键盘数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入数据:");
if (sc.hasNext()) {
String str = sc.next();
System.out.println("收到的数据为:" + str);
}
sc.close();
}
}

结果

请输入数据:
hello world
收到的数据为:hello

使用 next 方法:

import java.util.Scanner;

public class ScannerNextLine {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数据:");
if (sc.hasNextLine()) {
String str = sc.nextLine();
System.out.println("收到的数据为:" + str);
}
sc.close();
}
}

结果

请输入数据:
hello world
收到的数据为:hello world

输入基本数据类型

如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,

但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:

比如输入int类型的数据

if (sc.hasNextInt()) {
int i = sc.nextInt();
System.out.println("收到的数据为:" + i);
}

练习

输入多个数字,并求其总和与平均数,通过输入非数字来结束输入并输出执行结果:

import java.util.Scanner;

public class Sum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0;
int count = 0;
while (sc.hasNextInt()) {
int num = sc.nextInt();
sum += num;
count++;
}
System.out.println("总和:" + sum);
System.out.println("平均:" + (1.0 * sum / count)); sc.close();
}
}

结果·

1 2 3 4 5 q
总和:15
平均:3.0

注意

当使用nextLine()方法之前,使用过其他的方法,需要多使用一次nextLine()方法

如下代码,先输入一个年龄,再输入姓名

import java.util.Scanner;

public class ScannerBug {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = 0;
String str = null;
if (sc.hasNextInt()) {
num = sc.nextInt();
}
if (sc.hasNextLine()) {
str = sc.nextLine();
}
System.out.println("---------输出结果-------");
System.out.println("年龄" + num);
System.out.println("姓名" + str); sc.close();
}
}

结果

18
---------输出结果-------
年龄18
姓名

分析

在输入18按下回车之后,直接打印结果。跳过了姓名的输入,不妨试试使用空格分离输入的参数。

18 ljh
---------输出结果-------
年龄18
姓名 ljh

发现姓名后面多了个空格才打印输入的名字,说明nextInt()方法只读取到18。

18往后的数据都被nextLine()接收,正好nextLine()方法可以接收空白,所以包含了空格。

如果将nextLine()方法改成next()方法,不包含空白,可以解决以上问题。

package com.study.scanner;

import java.util.Scanner;

public class ScannerBug {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); int num = 0;
String str = null;
if (sc.hasNextInt()) {
num = sc.nextInt();
} if (sc.hasNext()) {
str = sc.next();
} System.out.println("---------输出结果-------");
System.out.println("年龄" + num);
System.out.println("姓名" + str); sc.close();
}
}

结果

18 ljh
---------输出结果-------
年龄18
姓名ljh 18
ljh
---------输出结果-------
年龄18
姓名ljh

那么就是要求nextLine()读取下一行数据怎么办呢?

如新增一个需求再读取一个电话号码,要求区号和尾号用空格隔开

public class ScannerBug {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); int num = 0;
String str = null;
String phone = null;
if (sc.hasNextInt()) {
num = sc.nextInt();
}
if (sc.hasNext()) {
str = sc.next();
}
if (sc.hasNextLine()) {
phone = sc.nextLine();
}
System.out.println("---------输出结果-------");
System.out.println("年龄" + num);
System.out.println("姓名" + str);
System.out.println("电话" + phone); sc.close();
}
}

结果

18
ljh
---------输出结果-------
年龄18
姓名ljh
电话 18 ljh 0771 1234
---------输出结果-------
年龄18
姓名ljh
电话 0771 1234

两种输入方式,第一种 nextLine()方法又读取了ljh后面的数据,导致第三个数据不能输入。

第二种输入方式多了个空格

考虑应该把ljh后面的数据给吃掉。再接收第三个数据

import java.util.Scanner;

public class ScannerBug {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); int num = 0;
String str = null;
String phone = null;
if (sc.hasNextInt()) {
num = sc.nextInt();
} if (sc.hasNext()) {
str = sc.next();
} if (sc.hasNextLine()) {
sc.nextLine();// 去除前一行多余的数据
phone = sc.nextLine();
} System.out.println("---------输出结果-------");
System.out.println("年龄" + num);
System.out.println("姓名" + str);
System.out.println("电话" + phone); sc.close();
}
}

结果

18
ljh
0771 1234
---------输出结果-------
年龄18
姓名ljh
电话0771 1234

最终达到想要的效果。

总结

nextXxx()方法只读取到相应的数值就停止,不含换行操作。

nextLine()方法在后面使用时,注意前面的方法是否含有换行处理。

Scanner 类的更多相关文章

  1. Scanner类

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

  2. java中scanner类的用法

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

  3. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  4. Java中Scanner类和BufferReader类之间的区别

    java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...

  5. Java用Scanner类获取用户输入

    用Java编写程序时,有些数据需要用户输入,这个时候需要调用java提供的Scanner类,这个类在包java.util下,比如求一个矩形的面积,简单的看一下用法: import java.util. ...

  6. Scanner类的使用

    Scanner类的使用 (接受键盘输入) java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java AP ...

  7. Android(java)学习笔记97:Scanner类使用

    package cn.itcast_01; /* * Scanner:用于接收键盘录入数据. * * 前面的时候: * A:导包 * B:创建对象 * C:调用方法 * * System类下有一个静态 ...

  8. Java API ——Scanner类

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

  9. Java中Scanner类

    java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序

  10. Scanner类的.next()和.hashNext()方法

    使用Scanner类可以很方便地便获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件.输入流 .字符串中解析出基本类型值和字符串值.Scanner类提供了多个构造器,不同 ...

随机推荐

  1. Java实现 蓝桥杯 历届试题 波动数列

    问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...

  2. Dockerfile 解析

    Dockerfile Dockerfile是用来构建Docker镜像的构建文件,是由一系列参数和命令构成的脚本. 构建的三个步骤:1.编写Dockerfile文件  2.docker build  3 ...

  3. 用js实现简单的抛物线运动

    前言 老早就看过一些购物车的抛物线效果,也想自己凑热闹动手来实现一遍. 然后(lll¬ω¬) 书到用时方恨少,发现高中学到物理啊.数学啊,都忘光了,抛物线公式都忘了0 0. 顺手百度一波,从百度可知: ...

  4. FT-8900, 8800,7800 , FT-897, 857 e 817 连接中继板接线图

    FT-8900, 8800,7800 , FT-897, 857 e 817 等 车台支持Moto GM950i GM300(只适合接收) GM3688等

  5. STL常用序列容器

    这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...

  6. STL中常用算法

    一.排序 sort sort(first_pointer,first_pointer+n,cmp) 默认为升序 若要使用降序,自行写cmp 函数 bool cmp(int a,int b){ retu ...

  7. Dedecms 目标仿站的学习视频

    目标网站首页的初步仿制(实站仿站)http://vodcdn.video.taobao.com/player/ugc/tb_ugc_bytes_core_player_loader.swf 目标网站首 ...

  8. easypoi 读取 Excel 简单应用

    背景 在做接口测试的时候,经常会使用 Excel 来存储对应的接口信息和用例信息,为了方便程序的读取,引入easypoi 工具来读取 Excel 内容.easypoi 比起 poi 使用更加的方便,代 ...

  9. 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?

    <大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...

  10. Largest Allowed Area【模拟+二分】

    Largest Allowed Area 题目链接(点击) 题目描述 A company is looking for land to build its headquarters. It has a ...