关于Scanner对象的输入结束标记问题
作者:CronousGT 发布时间:2022-02-20 08:02:11
Scanner对象的输入结束标记
最近开始复习java了,自己不知道或者需要注意的地方自己做个笔记
package gt;
import java.util.Scanner;
/**
* Created by Cronous on 2017/10/29.
*/
public class day01 {
public static void main(String[] args){
System.out.print("请输入值:");
Scanner s = new Scanner(System.in);
while(s.hasNext()){
System.out.println(s.next());
}
}
}
我们输入 ”123 345 678“ 然后回车,发现控制台打印
123
345
678
我看了下scanner的api它是这么说的 :
Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。
然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
所以这里我们知道它默认是以空白匹配,所以我们输入当中有空格,它会一次读取,直到回车,但是你会发现我们最后一个数字后面并没有空格,系统也将数据分割出来了,
可能到这里不知道我在说啥,看下个例子:
package gt;
import java.util.Scanner;
/**
* Created by Cronous on 2017/10/29.
*/
public class day01 {
public static void main(String[] args){
System.out.print("请输入值:");
Scanner s = new Scanner(System.in);
s.useDelimiter(" ");//这里我们将系统分隔符主动设置为 " "
while(s.hasNext()){
System.out.println(s.next());
}
}
}
在这里我们主动设置了一个分隔符 " " 然后上次一样输入数据,输入完按回车键 控制台效果如下:
123
345
这里我们会发现第三个数并没有输出,这是为什么? 我们发现我们输入完最后一个数时直接按回车了并没有输入我们设定的分隔符 " "
所以第三个数并没有被打印出来,我们这样输入 ”123 345 678 “再按回车就可以正常输出三个值,保证最后还有一个空格即可
再看一个代码(注意这里有个坑),我的需求是 获取输入值 ,当输入值为 "quit"时我们结束输入
package gt;
import java.util.Scanner;
/**
* Created by Cronous on 2017/10/29.
*/
public class day01 {
public static void main(String[] args){
System.out.print("请输入值:");
Scanner s = new Scanner(System.in);
while(s.hasNext()){
if("quit".equals(s.next())){
break;
}else{
System.out.println(s.next());
}
}
}
}
这里我们输入 ”123 345 quit“ 回车确认,这里我们希望得到输出为
123
345
可是我们的得到的输出为
345
为什么只有”345“输出? 这里我通过debug发现一个问题:因为当我们判断是否等于 ”quit“值时我们调用 s.next() 已经获取”123“了,后来打印的是再一次获取的值,也就是获取的下一个值 "345"了,所以最后出现了 只打印 ”345“的问题
下面给出正确代码,我们只需要保证s.next()值统一就行
package gt;
import java.util.Scanner;
/**
* Created by Cronous on 2017/10/29.
*/
public class day01 {
public static void main(String[] args){
System.out.print("请输入值:");
Scanner s = new Scanner(System.in);
while(s.hasNext()){
String a = s.next();//将s.next()赋值给变量a
if("quit".equals(a)){
break;
}else{
System.out.println(a);
}
}
}
}
这样即可解决,问题不大,但是需要注意一下。
Scanner的输入及理解
Scanner
new 新生的意思
System.out输出
System.in 输入
Scannery对象
基本语法:
Scanner s = new Scanner(System.in);
通过Scanner类的next(下一个)与nextline(下一行)方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextline()判断是否还有输入的数据。
package Scnner;
import java.util.Scanner;
public class Day01 {
public static void main(String[] args) {
//创建一个扫描对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
//接收用户的输入,并把它封装scanner
System.out.println("使用next方式接收:");
//判断用户有没有输出字符串
if (scanner.hasNext()==true){
//这里默认==true,不用谢也可以,但是还是建议写
String str = scanner.next();
//使用next方式接收
System.out.println("输出的内容为:"+str);
}
}
}
next()
一定要读取到有效字符后才可以结束输入。
对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
只有输入有效字符后才将其后面输入的空白作为分隔符或者借宿符。
next()不能得到带有空格的字符串
nextLine()
以enter为结束符,也就是说nextLine()方法返回的输入回车之前的所有字符。
可以获得空白
package Scnner;
import java.util.Scanner;
public class Day02 {
public static void main(String[] args) {
//从键盘来接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断是否还有输入
if (scanner.hasNextLine()){
//等待用户去输入
String str = scanner.nextLine();
System.out.println("输出的内容:"+str);
}
scanner.close();
}
}
当然也可以不要if去判断
if (scanner.hasNextLine())
package Scnner;
import java.util.Scanner;
public class Day03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String str = scanner.nextLine();
System.out.println("输出的内容:"+str);
scanner.close();
}
这样也是可以的
Scanner输入内容理解(重点)
我个人是这样理解的
输入输出我们只要记住3行代码就行
System.out.println("请输入数据:");
String str = scanner.nextLine();
System.out.println("输出的内容:"+str);
第一行代码是标题
请输入数据:
第二行代码: 是我们键盘所输出的所有内容,知道你按下回车键(enter)之后,把所有内容变成一个变量保存再str里面
第三行代码:则是等待第二行代码运行完成后,将输出内容+str(你键盘敲下的所有字符,也就是内容) 一起显示出来
如下图
第一行为第一行代码
第二行hello world 为第二行代码,也就是你键盘敲下的内容
第三行则是等待第二行代码运行完成后,输出的内衣+键盘敲下的所有字符一起显示出来
注意
//凡是IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关掉
scanner.close();
//IO流 输入输出流
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/CronousGT/article/details/78387558


猜你喜欢
- Java Config 下的Spring Test方式用了三种方式:1.纯手动取bean:package com.wang.test;imp
- 1.基本概念首先我们需要弄清楚几个概念:面向对象是什么、类是什么、对象又是什么?还是逐个来说1.1面向对象我们常说Java是面向对象的语言,
- 在 C# WPF开发中颜色对话框控件(ColorDialog)用于对界面中的背景、文字…(拥有颜色属性的所有控件)设置
- 背景随着富客户端框架的盛行,以及众多优秀的前端js框架,很多情况我们会遇到跨域的问题,而js的ajax请求是不允许直接跨域访问的,当然你会说
- 本文实例为大家分享了unity实现玻璃效果的具体代码,供大家参考,具体内容如下一、使用Cubemap,做一个假反射shader代码如下:Sh
- 最近项目里面有个地方是在前面用glide加载图片后,后面再另外一个地方加载相同图片时没有复用glide的缓存,而是自己另外又重新缓存了一套。
- 1、spring-cloud-starter-alibaba-nacos-discovery 这里依赖报红,无法引入,或显示无法找到,更换版
- PPT中的动画效果可分为已有内置动画以及自定义动画。设置内置动画,只需直接指定动画效果类型即可。本文主要介绍如何实现自定义动画,即自定义形状
- 作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例。但是像微信那样点击
- 要说this和super就不得不说Java的封装和继承了,首先说封装,这是一种思想,算不上一种技术,核心思想就是将对象的同一行为和状态看成是
- 事发地原默认的Feign是使用URLConnector进行通信的,当换为okhttp时,直接引入包及配置以下内容根本不生效,还是走原生的。f
- 自定义View一直是横在Android开发者面前的一道坎。一、View和ViewGroup的关系从View和ViewGroup的关系来看,V
- float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间double是双精度
- 本文实例讲述了Android观察者模式。分享给大家供大家参考。具体分析如下:一、环境:主机:WIN8开发环境:Eclipse二、说明:1.打
- package com.weixin.util;import java.io.IOException;import java.util.Ra
- 一:回顾反射机制这种重点回顾一下反射Method!为什么要回顾反射机制呢?因为我们后面要手写一个简易的Spring框架,便于我们理解其中的核
- dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。什么是"动态"?编程语言有时可以划分为静态
- 一、String与Date(java.util.Date)互转 1.1 String -&g
- 前言终于来到了Maven的插件开发,其实Maven的插件并没有想象的那么难,刚开始讲Maven基础的时候就演示了一下JDK是如何打包的,Ma
- 获取当前键盘按键,代码如下:using UnityEngine;using System.Collections;public class