Java鍵盤錄入Scanner類的使用方法詳析
引言
我們要學(xué)的Scanner類是屬于引用數(shù)據(jù)類型,我們先了解下引用數(shù)據(jù)類型。
引用數(shù)據(jù)類型的使用
與定義基本數(shù)據(jù)類型變量不同,引用數(shù)據(jù)類型的變量定義及賦值有一個相對固定的步驟或格式。
數(shù)據(jù)類型 變量名 = new 數(shù)據(jù)類型();
每種引用數(shù)據(jù)類型都有其功能,我們可以調(diào)用該類型實(shí)例的功能。
變量名.方法名();
1. Scanner類的介紹
Scanner類是一個用于掃描輸入文本的新的實(shí)用程序。
Scanner類是引用數(shù)據(jù)類型的一種,我們可以使用該類來完成用戶鍵盤錄入,獲取到錄入的數(shù)據(jù)。
2. Scanner使用步驟:
導(dǎo)包:import java.util.Scanner; 創(chuàng)建對象實(shí)例:Scanner sc = new Scanner(System.in); 調(diào)用方法: int i = sc.nextInt(); 用來接收控制臺錄入的數(shù)字 String s = sc.next(); 用來接收控制臺錄入的字符串
示例
package com.doit.day0217; import java.util.Scanner; /** * @日期: 2024/4/13 * @Author: Wang NaPao * @Blog: https://blog.csdn.net/weixin_40968325?spm=1018.2226.3001.5343 * @Tips: 和我一起學(xué)習(xí)吧 * @Description: */ public class Test10 { public static void main(String[] args) { //創(chuàng)建Scanner引用類型的變量 Scanner sc = new Scanner(System.in); //獲取數(shù)字 System.out.println("請輸入一個數(shù)字"); int n=sc.nextInt(); System.out.println("n的值為"+n); //獲取字符串 System.out.println("請輸入一個字符串"); String str=sc.next(); System.out.println("str的值為"+str); } }
3. Scanner類的各種數(shù)據(jù)類型
使用nextByte()、nextDouble()、nextFloat()、nextInt()、nextLong()、nextShort();
上述方法包括next和nextLine執(zhí)行時都會造成堵塞,等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn)。
使用這些方法可以讀取對應(yīng)的數(shù)據(jù)類型直到空格,并且只讀對應(yīng)的數(shù)據(jù)類型,輸入其他類型的值會報(bào)InputMismatchException異常。
4. 關(guān)閉Scanner類
使用完Scanner后,我們一定要記得將它關(guān)閉!
因?yàn)槭褂肧canner本質(zhì)上是打開了一個IO流,如果不關(guān)閉的話,它將會一直占用系統(tǒng)資源。
但是注意一旦你關(guān)閉后,就算在sc.close()這行代碼后你再重新new Scanner(System.in),那也不能重新再打開一個掃描器了,如下圖發(fā)現(xiàn)程序會報(bào)錯
所以大家一定要在用不到掃描器之后再關(guān)閉,即把sc.close()代碼放到最后。
package Day1108; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in);//讀入 System.out.println("請輸入一個整數(shù)"); BigInteger bi=sc.nextBigInteger();//讀入一個Integer System.out.println("bi="+bi); sc.close(); Scanner sc1=new Scanner(System.in); System.out.println("請輸入一個整數(shù)"); BigInteger bi1=sc.nextBigInteger();//讀入一個Integer System.out.println("bi1="+bi1); } }
結(jié)果
5. next()和nextLine()的區(qū)別
從上面的講解,我們會發(fā)現(xiàn)當(dāng)我們想要輸入的數(shù)據(jù)是String類型時,我們有兩個方法可以調(diào)用,next()和nextLine().
那這兩種方法具體有什么區(qū)別呢?
1)我們先來測試一下next():
package Day1108; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in);//讀入 String s=sc.next(); System.out.println(s); } }
結(jié)果:
從結(jié)果可以看出:
next()方法再識別輸入的字符串時,不能得到我們輸入的帶有空格的字符串,只是讀取到了Hello.
這說明next()在讀取到有效字符之后會以空格作為自己的讀取結(jié)束標(biāo)識符,因?yàn)槲覀兛梢园l(fā)現(xiàn)Hello前面的空格并沒有影響到方法的讀取。
所以next()用法總結(jié)如下:
一定要讀取到有效字符之后才可以結(jié)束輸入
對輸入的有效字符后才能將其后面的輸入的空白作為結(jié)束符
只有輸入的有效字符后才將其后面輸入的空白作為結(jié)束符
next()不能得到帶有空格的字符串
讀取結(jié)束后,該方法會將我們的鼠標(biāo)定位在我們輸入數(shù)據(jù)的那一行。
2)我們再來測試一下nextLine()
package Day1108; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in);//讀入 String s=sc.nextLine(); System.out.println(s); } }
結(jié)果
分析結(jié)果發(fā)現(xiàn),輸出結(jié)果與輸入結(jié)果完全一致,nextLine()并沒有被字符串中間的空格影響讀取結(jié)果。
這是因?yàn)樵摲椒ㄒ缘氖腔剀嚪ㄒ簿褪俏覀冩I盤的enter鍵)作為結(jié)束標(biāo)識符。
所以nextLine()用法總結(jié):
以回車符作為結(jié)束標(biāo)識符,獲取到的是回車符前面輸入的所有字符串(包括空格)
讀取結(jié)束后,該方法會將我們的鼠標(biāo)定位在我們輸入數(shù)據(jù)的那一行的下一行。
6. hasNext和hasNextLine的區(qū)別
二者都是用于判斷"有無鍵盤輸入”的,有則返回true,沒有則阻塞!
一定記住是阻塞而不是返回false,很多人都說是返回false,但你查源碼會發(fā)現(xiàn)是不會返回false的,他會讓你一直阻塞在判斷階段,二者只是在細(xì)節(jié)上有不同。
hasNext()方法會判斷接下來是否有非空字符,如果有,則返回true,沒有則阻塞。例如一直敲回車相當(dāng)于一直判斷為空字符,但是不會返回fasle,而是一直阻塞在判斷階段,直到你輸入了非空字符。
hasNextLine()方法會根據(jù)行匹配模式取判斷接下來是否有一行(包括空行),如果有,則返回true.這個沒什么特別的,只要是你巧了回車那都是true并且不會阻塞。
??實(shí)例1
package Day1108; import day1107.DemoTest07; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in); System.out.println(sc.hasNext()); } }
結(jié)果:(按了很多個換行也無法結(jié)束,處于阻塞階段)
??實(shí)例2:
package Day1108; import day1107.DemoTest07; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in); System.out.println(sc.hasNextLine()); } }
結(jié)果:
(直接按回車鍵也會為true)
總結(jié):
next()方法不能錄入空格,在特定情況下會把空格當(dāng)作回車,nextLine方法可以錄入空格
hasNext()和hasNextLine的返回值都是boolean類型,但只有可能返回true,不可能返回false,并且都默認(rèn)以回車鍵為結(jié)束符(hasNext可以設(shè)置為任意符號位結(jié)束符,不在本文研究范圍之內(nèi))
hasNext、next不能直接識別luo,而hasNextLine和nextLine都可以之別裸回車。換句話講:對于不輸入符號而直接裸敲一個回車的操作,只有后兩個能識別到。
hasNext、hasNextLine在返回一個boolean類型結(jié)果為true的同時,會在堆空間中開辟一塊專門用于存放剛剛輸入的字符串,用于下次next或者nextLine:即下次next或者nextLine不需要再從鍵盤輸入,相當(dāng)于系統(tǒng)自動把剛剛輸入的字符串再原封不動的輸入了一遍。同時這個存儲壽命=調(diào)用對象的壽命。
對于hasNext來說,每次敲擊回車都相當(dāng)于在堆空間中開辟一行,敲幾次回車就會直接給后續(xù)next、nextLine方法賦值幾次。
hasNext是線程阻塞的,對于hasNext來說,如果一直不輸入字符,反而一直敲回車的話,整個線程會卡在這個輸入的地方,直到有字符輸入。
因?yàn)閔asNext、hasNextLine與next、nextLine有2x2種組合方式,所以我們用4段代碼做4次實(shí)驗(yàn)就可以大體上了解它們的特性了。
1)hasNext和next組合
package Day1108; import day1107.DemoTest07; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in); System.out.println("請輸入字符串,并多混入空格回車嘗試不同結(jié)果"); if(sc.hasNext()){ System.out.println("第一次"+sc.next()); System.out.println("第二次"+sc.next()); System.out.println("第三次"+sc.next()); } } }
結(jié)果:
嘗試輸入:空格aaa空格bbb空格ccc回車
2)hasNext和nextLine組合
package Day1108; import day1107.DemoTest07; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in); System.out.println("請輸入字符串,并多混入空格回車嘗試不同結(jié)果"); if(sc.hasNext()){ System.out.println("第一次"+sc.nextLine()); System.out.println("第二次"+sc.nextLine()); System.out.println("第三次"+sc.nextLine()); } } }
結(jié)果:
光標(biāo)仍然閃爍,證明堆空間中的aaa bbb ccc只賦值給了第一個,這也驗(yàn)證了nextLine可以錄入空格。此時線控正在等待用戶輸入第二個nextLine.
3)hasNextLine和next組合
package Day1108; import day1107.DemoTest07; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in); System.out.println("請輸入字符串,并多混入空格回車嘗試不同結(jié)果"); if(sc.hasNextLine()){ System.out.println("第一次"+sc.next()); System.out.println("第二次"+sc.next()); System.out.println("第三次"+sc.next()); } } }
結(jié)果
4)hasNextLine和nextLine組合
package Day1108; import day1107.DemoTest07; import java.util.Scanner; public class BidDecimal01 { public static void main(Stringargs) { Scanner sc=new Scanner(System.in); System.out.println("請輸入字符串,并多混入空格回車嘗試不同結(jié)果"); if(sc.hasNextLine()){ System.out.println("第一次"+sc.nextLine()); System.out.println("第二次"+sc.nextLine()); System.out.println("第三次"+sc.nextLine()); } } }
結(jié)果:
如果連續(xù)敲回車,那么hasNextLine也會判斷為true,同時進(jìn)入if語句執(zhí)行。
總結(jié)
到此這篇關(guān)于Java鍵盤錄入Scanner類的使用方法的文章就介紹到這了,更多相關(guān)Java鍵盤錄入Scanner類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 定時器(Timer)及線程池里使用定時器實(shí)例代碼
這篇文章主要介紹了Java 定時器(Timer)及線程池里使用定時器實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12解決Springboot項(xiàng)目啟動后自動創(chuàng)建多表關(guān)聯(lián)的數(shù)據(jù)庫與表的方案
這篇文章主要介紹了解決Springboot項(xiàng)目啟動后自動創(chuàng)建多表關(guān)聯(lián)的數(shù)據(jù)庫與表的方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03SpringBoot?HikariCP配置項(xiàng)及源碼解析
這篇文章主要為大家介紹了SpringBoot?HikariCP配置項(xiàng)及源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02java面試散列表及樹所對應(yīng)容器類及HashMap沖突解決全面分析
這篇文章主要介紹了java面試中的java散列表及樹所對應(yīng)容器類與HashMap沖突解決的問題總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10SpringBoot實(shí)現(xiàn)RabbitMQ監(jiān)聽消息的四種方式
本文主要介紹了SpringBoot實(shí)現(xiàn)RabbitMQ監(jiān)聽消息的四種方式,包括@RabbitListener,MessageListener接口,MessageListenerAdapter適配器,@RabbitHandler這幾種,感興趣的可以了解一下2024-05-05