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