Scanner 类
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 类的更多相关文章
- Scanner类
Scanner类:用于获取用户的键盘输入 成员方法: public boolean hasNextXxx():判断是否某种类型的元素 public Xxx nextXxx():获取该元素 常用方法: ...
- java中scanner类的用法
在Eclipse中编写程序时,如果我们的变量是需要手动输入的时候,我们就可以用到scanner类了. Scanner类,这是一个用于扫描输入文本的新的实用程序.由于任何数据都必须通过同一模式的捕获组检 ...
- c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
- Java中Scanner类和BufferReader类之间的区别
java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...
- Java用Scanner类获取用户输入
用Java编写程序时,有些数据需要用户输入,这个时候需要调用java提供的Scanner类,这个类在包java.util下,比如求一个矩形的面积,简单的看一下用法: import java.util. ...
- Scanner类的使用
Scanner类的使用 (接受键盘输入) java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java AP ...
- Android(java)学习笔记97:Scanner类使用
package cn.itcast_01; /* * Scanner:用于接收键盘录入数据. * * 前面的时候: * A:导包 * B:创建对象 * C:调用方法 * * System类下有一个静态 ...
- Java API ——Scanner类
1.Scanner类概述 JDK5以后用于获取用户的键盘输入,一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器.Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空 ...
- Java中Scanner类
java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序
- Scanner类的.next()和.hashNext()方法
使用Scanner类可以很方便地便获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件.输入流 .字符串中解析出基本类型值和字符串值.Scanner类提供了多个构造器,不同 ...
随机推荐
- Java实现空瓶换汽水
1 空瓶换汽水 浪费可耻,节约光荣.饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料.刚好小明前两天买了2瓶该饮料喝完了,瓶子还在.他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一 ...
- java实现第五届蓝桥杯六角填数
六角填数 题目描述 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不 ...
- java代码(12) ---CollectionUtils工具类
CollectionUtils工具类 CollectionUtils工具类是在apache下的,而不是springframework下的CollectionUtils 个人觉得在真实项目中Collec ...
- MAC/VMware配置双机调试简述
Configuration 注:建议提前备份所有修改内容,可能会导致无法开机. 我的测试环境: server: windows 10 + windbg client: windows 7 Server ...
- curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to storage.googleapis.com:443
安装nvm的时候, ➜ ~ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash 错 ...
- 油猴脚本 之 网教通直播评论记录抓取 v2.0
先放一个 <油猴脚本 之 网教通直播评论记录抓取>那篇文章的传送门 . 修复内容 将所有表情转为 [符号表情] 字样,而非删除: 修复被禁言用户读取异常,现在被禁言用户表示为 张三 [已禁 ...
- 迁移AndroidX
1. 前言 AndroidX replaces the original support library APIs with packages in the androidx namespace. O ...
- 东方步进电机马达驱动板CVK系列说明书
东方步进电机马达驱动板CVK系列说明书
- PN532模块连接-读卡失败原因
第一步:点击发现NFC设备 第二步:点击读整卡:读取卡片内容. 若不成功,把UID卡移开,再放一次.再点第一步,显示发现NFC,再点第二步.反复操作,直到读取到为止.2-3次一般都会成功 . 相关软件 ...
- 【asp.net core 系列】- 11 Service层的实现样板
0.前言 在<asp.net core 系列>之实战系列中,我们在之前的篇幅中对项目有了一个大概的认知,也搭建了一个基础的项目骨架.那么就让我们继续完善这个骨架,让它更加丰满.这一篇,我将 ...