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类提供了多个构造器,不同 ...
随机推荐
- Android9.0配置charles的https抓包
问题: 按照charles的正常流程去安装证书后,然后使用手机(一加5T,安卓9.0)访问https站点发现有些CONNECT请求无法查看,但是其它类型都支持https 解决方案: 前提条件:手机已经 ...
- Python—变量,条件语句,while循环,运算符,字符串等
Python初识以及变量: 变量名:——字母 ——数字 ——下划线[见名识意] (PS:数字不能开头:不能是关键字:最好不能和python内置的东西重复) ##################### ...
- 温故知新-Mysql索引结构&页&聚集索引&非聚集索
文章目录 摘要 索引 索引概述 索引优势劣势 索引结构 BTREE 结构 B+TREE 结构 页 索引分类 索引语法 索引设计原则 聚触索引 & 非聚触索引 你的鼓励也是我创作的动力 Post ...
- 全面概述Gitee和GitHub生成/添加SSH公钥
前言 现如今将代码开源已经成为软件开发行业的一种趋势,而现在比较有名的代码托管平台有GItHub.Gitee.Gitlab等相关平台.而我们在使用代码托管平台最为常见的就是如何将自己本地的代码推送到远 ...
- PAT1040 Longest Symmetric String (25分) 中心扩展法+动态规划
题目 Given a string, you are supposed to output the length of the longest symmetric sub-string. For ex ...
- String 的格式化
使用场景 用于生成redis等key-value 结构的key的格式化,方便管理 eg: String.format(RedisKeys.PURCHASE_ADD_BABY_LOCK,form.get ...
- win系统DOS批处理命令:每日根据定时计划,弹出相应的提醒
@echo off setlocal enabledelayedexpansion ::设置数据源 ::set DATASET=D:\soft\xinyu\xinyu.txt ::获取系统时间的星期值 ...
- @loj - 3046@「ZJOI2019」语言
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢规律的女孩子.按照规律,第二题应该是一道和数据 ...
- @codefoces - 566E@ Restoring Map
目录 @description@ @solution@ @accepted code@ @details@ @description@ 对于一棵 n 个点的树,我们称两个点是相邻的当且仅当两个点的距离 ...
- 在Xcode11上开发“面向低于iOS13版本的App”时的一些注意点
相关知识: https://blog.csdn.net/BUG_delete/article/details/103699563 'AppDelegate' is only available in ...