關(guān)于Scanner對(duì)象的輸入結(jié)束標(biāo)記問(wèn)題
Scanner對(duì)象的輸入結(jié)束標(biāo)記
最近開始復(fù)習(xí)java了,自己不知道或者需要注意的地方自己做個(gè)筆記
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("請(qǐng)輸入值:"); ? ? ? ? Scanner s = new Scanner(System.in); ? ? ? ? while(s.hasNext()){ ? ? ? ? ? ? System.out.println(s.next()); ? ? ? ? } ? ? } }
我們輸入 ”123 345 678“ 然后回車,發(fā)現(xiàn)控制臺(tái)打印
123
345
678
我看了下scanner的api它是這么說(shuō)的 :
Scanner 使用分隔符模式將其輸入分解為標(biāo)記,默認(rèn)情況下該分隔符模式與空白匹配。
然后可以使用不同的 next 方法將得到的標(biāo)記轉(zhuǎn)換為不同類型的值。
所以這里我們知道它默認(rèn)是以空白匹配,所以我們輸入當(dāng)中有空格,它會(huì)一次讀取,直到回車,但是你會(huì)發(fā)現(xiàn)我們最后一個(gè)數(shù)字后面并沒有空格,系統(tǒng)也將數(shù)據(jù)分割出來(lái)了,
可能到這里不知道我在說(shuō)啥,看下個(gè)例子:
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("請(qǐng)輸入值:"); ? ? ? ? Scanner s = new Scanner(System.in); ? ? ? ? s.useDelimiter(" ");//這里我們將系統(tǒng)分隔符主動(dòng)設(shè)置為 " " ? ? ? ? while(s.hasNext()){ ? ? ? ? ? ? System.out.println(s.next()); ? ? ? ? } ? ? } }
在這里我們主動(dòng)設(shè)置了一個(gè)分隔符 " " 然后上次一樣輸入數(shù)據(jù),輸入完按回車鍵 控制臺(tái)效果如下:
123
345
這里我們會(huì)發(fā)現(xiàn)第三個(gè)數(shù)并沒有輸出,這是為什么? 我們發(fā)現(xiàn)我們輸入完最后一個(gè)數(shù)時(shí)直接按回車了并沒有輸入我們?cè)O(shè)定的分隔符 " "
所以第三個(gè)數(shù)并沒有被打印出來(lái),我們這樣輸入 ”123 345 678 “再按回車就可以正常輸出三個(gè)值,保證最后還有一個(gè)空格即可
再看一個(gè)代碼(注意這里有個(gè)坑),我的需求是 獲取輸入值 ,當(dāng)輸入值為 "quit"時(shí)我們結(jié)束輸入
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("請(qǐng)輸入值:"); ? ? ? ? Scanner s = new Scanner(System.in); ? ? ? ? while(s.hasNext()){ ? ? ? ? ? ?if("quit".equals(s.next())){ ? ? ? ? ? ? ? ?break; ? ? ? ? ? ?}else{ ? ? ? ? ? ? ? ?System.out.println(s.next()); ? ? ? ? ? ?} ? ? ? ? } ? ? } }
這里我們輸入 ”123 345 quit“ 回車確認(rèn),這里我們希望得到輸出為
123
345
可是我們的得到的輸出為
345
為什么只有”345“輸出? 這里我通過(guò)debug發(fā)現(xiàn)一個(gè)問(wèn)題:因?yàn)楫?dāng)我們判斷是否等于 ”quit“值時(shí)我們調(diào)用 s.next() 已經(jīng)獲取”123“了,后來(lái)打印的是再一次獲取的值,也就是獲取的下一個(gè)值 "345"了,所以最后出現(xiàn)了 只打印 ”345“的問(wèn)題
下面給出正確代碼,我們只需要保證s.next()值統(tǒng)一就行
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("請(qǐng)輸入值:"); ? ? ? ? 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); ? ? ? ? ? ?} ? ? ? ? } ? ? } }
這樣即可解決,問(wèn)題不大,但是需要注意一下。
Scanner的輸入及理解
Scanner
- new 新生的意思
- System.out輸出
- System.in 輸入
Scannery對(duì)象
基本語(yǔ)法:
Scanner s = new Scanner(System.in);
通過(guò)Scanner類的next(下一個(gè))與nextline(下一行)方法獲取輸入的字符串,在讀取前我們一般需要使用hasNext()與hasNextline()判斷是否還有輸入的數(shù)據(jù)。
package Scnner; import java.util.Scanner; public class Day01 { public static void main(String[] args) { //創(chuàng)建一個(gè)掃描對(duì)象,用于接收鍵盤數(shù)據(jù) Scanner scanner = new Scanner(System.in); //接收用戶的輸入,并把它封裝scanner System.out.println("使用next方式接收:"); //判斷用戶有沒有輸出字符串 if (scanner.hasNext()==true) { //這里默認(rèn)==true,不用謝也可以,但是還是建議寫 String str = scanner.next(); //使用next方式接收 System.out.println("輸出的內(nèi)容為:"+str); } } }
next()
一定要讀取到有效字符后才可以結(jié)束輸入。
對(duì)輸入有效字符之前遇到的空白,next()方法會(huì)自動(dòng)將其去掉。
只有輸入有效字符后才將其后面輸入的空白作為分隔符或者借宿符。
next()不能得到帶有空格的字符串
nextLine()
以enter為結(jié)束符,也就是說(shuō)nextLine()方法返回的輸入回車之前的所有字符。
可以獲得空白
package Scnner; import java.util.Scanner; public class Day02 { public static void main(String[] args) { //從鍵盤來(lái)接收數(shù)據(jù) Scanner scanner = new Scanner(System.in); System.out.println("使用nextLine方式接收:"); //判斷是否還有輸入 if (scanner.hasNextLine()){ //等待用戶去輸入 String str = scanner.nextLine(); System.out.println("輸出的內(nèi)容:"+str); } scanner.close(); } }
當(dāng)然也可以不要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("請(qǐng)輸入數(shù)據(jù):"); ?? ??? ?String str = scanner.nextLine(); ?? ??? ?System.out.println("輸出的內(nèi)容:"+str);?? ?? ? ?? ??? ?scanner.close();? ?? ? ?? ?}
這樣也是可以的
Scanner輸入內(nèi)容理解(重點(diǎn))
我個(gè)人是這樣理解的
輸入輸出我們只要記住3行代碼就行
System.out.println("請(qǐng)輸入數(shù)據(jù):"); ?? ??? ?String str = scanner.nextLine(); ?? ??? ?System.out.println("輸出的內(nèi)容:"+str);
第一行代碼是標(biāo)題
請(qǐng)輸入數(shù)據(jù):
第二行代碼: 是我們鍵盤所輸出的所有內(nèi)容,知道你按下回車鍵(enter)之后,把所有內(nèi)容變成一個(gè)變量保存再str里面
第三行代碼:則是等待第二行代碼運(yùn)行完成后,將輸出內(nèi)容+str(你鍵盤敲下的所有字符,也就是內(nèi)容) 一起顯示出來(lái)
如下圖
第一行為第一行代碼
第二行hello world 為第二行代碼,也就是你鍵盤敲下的內(nèi)容
第三行則是等待第二行代碼運(yùn)行完成后,輸出的內(nèi)衣+鍵盤敲下的所有字符一起顯示出來(lái)
注意
//凡是IO流的類如果不關(guān)閉會(huì)一直占用資源,要養(yǎng)成好習(xí)慣用完就關(guān)掉 ?? ??? ?scanner.close(); ?? ??? ?//IO流 輸入輸出流
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
RabbitMq消息防丟失功能實(shí)現(xiàn)方式講解
這篇文章主要介紹了RabbitMq消息防丟失功能實(shí)現(xiàn),RabbitMQ中,消息丟失可以簡(jiǎn)單的分為兩種:客戶端丟失和服務(wù)端丟失。針對(duì)這兩種消息丟失,RabbitMQ都給出了相應(yīng)的解決方案2023-01-01java使用Validation進(jìn)行數(shù)據(jù)校驗(yàn)的方式總結(jié)
在Java中提供了一系列的校驗(yàn)方式,下面這篇文章主要給大家介紹了關(guān)于java使用Validation進(jìn)行數(shù)據(jù)校驗(yàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06SpringBoot整合POI實(shí)現(xiàn)Excel文件讀寫操作
EasyExcel是一個(gè)基于Java的、快速、簡(jiǎn)潔、解決大文件內(nèi)存溢出的Excel處理工具,這篇文章主要介紹了SpringBoot整合POI實(shí)現(xiàn)Excel文件讀寫操作,首先準(zhǔn)備環(huán)境進(jìn)行一系列操作,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案
這篇文章主要介紹了詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法
這篇文章主要介紹了Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02