Java鍵盤錄入Scanner類的使用方法詳析
引言
我們要學的Scanner類是屬于引用數(shù)據(jù)類型,我們先了解下引用數(shù)據(jù)類型。
引用數(shù)據(jù)類型的使用
與定義基本數(shù)據(jù)類型變量不同,引用數(shù)據(jù)類型的變量定義及賦值有一個相對固定的步驟或格式。
數(shù)據(jù)類型 變量名 = new 數(shù)據(jù)類型();
每種引用數(shù)據(jù)類型都有其功能,我們可以調用該類型實例的功能。
變量名.方法名();
1. Scanner類的介紹
Scanner類是一個用于掃描輸入文本的新的實用程序。
Scanner類是引用數(shù)據(jù)類型的一種,我們可以使用該類來完成用戶鍵盤錄入,獲取到錄入的數(shù)據(jù)。
2. Scanner使用步驟:
導包:import java.util.Scanner; 創(chuàng)建對象實例:Scanner sc = new Scanner(System.in); 調用方法: 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: 和我一起學習吧 * @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ù)回車確認。
使用這些方法可以讀取對應的數(shù)據(jù)類型直到空格,并且只讀對應的數(shù)據(jù)類型,輸入其他類型的值會報InputMismatchException異常。
4. 關閉Scanner類
使用完Scanner后,我們一定要記得將它關閉!
因為使用Scanner本質上是打開了一個IO流,如果不關閉的話,它將會一直占用系統(tǒng)資源。
但是注意一旦你關閉后,就算在sc.close()這行代碼后你再重新new Scanner(System.in),那也不能重新再打開一個掃描器了,如下圖發(fā)現(xià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); } }
結果
5. next()和nextLine()的區(qū)別
從上面的講解,我們會發(fā)現(xiàn)當我們想要輸入的數(shù)據(jù)是String類型時,我們有兩個方法可以調用,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); } }
結果:
從結果可以看出:
next()方法再識別輸入的字符串時,不能得到我們輸入的帶有空格的字符串,只是讀取到了Hello.
這說明next()在讀取到有效字符之后會以空格作為自己的讀取結束標識符,因為我們可以發(fā)現(xiàn)Hello前面的空格并沒有影響到方法的讀取。
所以next()用法總結如下:
一定要讀取到有效字符之后才可以結束輸入
對輸入的有效字符后才能將其后面的輸入的空白作為結束符
只有輸入的有效字符后才將其后面輸入的空白作為結束符
next()不能得到帶有空格的字符串
讀取結束后,該方法會將我們的鼠標定位在我們輸入數(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); } }
結果
分析結果發(fā)現(xiàn),輸出結果與輸入結果完全一致,nextLine()并沒有被字符串中間的空格影響讀取結果。
這是因為該方法以的是回車符(也就是我們鍵盤的enter鍵)作為結束標識符。
所以nextLine()用法總結:
以回車符作為結束標識符,獲取到的是回車符前面輸入的所有字符串(包括空格)
讀取結束后,該方法會將我們的鼠標定位在我們輸入數(shù)據(jù)的那一行的下一行。
6. hasNext和hasNextLine的區(qū)別
二者都是用于判斷"有無鍵盤輸入”的,有則返回true,沒有則阻塞!
一定記住是阻塞而不是返回false,很多人都說是返回false,但你查源碼會發(fā)現(xiàn)是不會返回false的,他會讓你一直阻塞在判斷階段,二者只是在細節(jié)上有不同。
hasNext()方法會判斷接下來是否有非空字符,如果有,則返回true,沒有則阻塞。例如一直敲回車相當于一直判斷為空字符,但是不會返回fasle,而是一直阻塞在判斷階段,直到你輸入了非空字符。
hasNextLine()方法會根據(jù)行匹配模式取判斷接下來是否有一行(包括空行),如果有,則返回true.這個沒什么特別的,只要是你巧了回車那都是true并且不會阻塞。
??實例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()); } }
結果:(按了很多個換行也無法結束,處于阻塞階段)
??實例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()); } }
結果:
(直接按回車鍵也會為true)
總結:
next()方法不能錄入空格,在特定情況下會把空格當作回車,nextLine方法可以錄入空格
hasNext()和hasNextLine的返回值都是boolean類型,但只有可能返回true,不可能返回false,并且都默認以回車鍵為結束符(hasNext可以設置為任意符號位結束符,不在本文研究范圍之內)
hasNext、next不能直接識別luo,而hasNextLine和nextLine都可以之別裸回車。換句話講:對于不輸入符號而直接裸敲一個回車的操作,只有后兩個能識別到。
hasNext、hasNextLine在返回一個boolean類型結果為true的同時,會在堆空間中開辟一塊專門用于存放剛剛輸入的字符串,用于下次next或者nextLine:即下次next或者nextLine不需要再從鍵盤輸入,相當于系統(tǒng)自動把剛剛輸入的字符串再原封不動的輸入了一遍。同時這個存儲壽命=調用對象的壽命。
對于hasNext來說,每次敲擊回車都相當于在堆空間中開辟一行,敲幾次回車就會直接給后續(xù)next、nextLine方法賦值幾次。
hasNext是線程阻塞的,對于hasNext來說,如果一直不輸入字符,反而一直敲回車的話,整個線程會卡在這個輸入的地方,直到有字符輸入。
因為hasNext、hasNextLine與next、nextLine有2x2種組合方式,所以我們用4段代碼做4次實驗就可以大體上了解它們的特性了。
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("請輸入字符串,并多混入空格回車嘗試不同結果"); if(sc.hasNext()){ System.out.println("第一次"+sc.next()); System.out.println("第二次"+sc.next()); System.out.println("第三次"+sc.next()); } } }
結果:
嘗試輸入:空格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("請輸入字符串,并多混入空格回車嘗試不同結果"); if(sc.hasNext()){ System.out.println("第一次"+sc.nextLine()); System.out.println("第二次"+sc.nextLine()); System.out.println("第三次"+sc.nextLine()); } } }
結果:
光標仍然閃爍,證明堆空間中的aaa bbb ccc只賦值給了第一個,這也驗證了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("請輸入字符串,并多混入空格回車嘗試不同結果"); if(sc.hasNextLine()){ System.out.println("第一次"+sc.next()); System.out.println("第二次"+sc.next()); System.out.println("第三次"+sc.next()); } } }
結果
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("請輸入字符串,并多混入空格回車嘗試不同結果"); if(sc.hasNextLine()){ System.out.println("第一次"+sc.nextLine()); System.out.println("第二次"+sc.nextLine()); System.out.println("第三次"+sc.nextLine()); } } }
結果:
如果連續(xù)敲回車,那么hasNextLine也會判斷為true,同時進入if語句執(zhí)行。
總結
到此這篇關于Java鍵盤錄入Scanner類的使用方法的文章就介紹到這了,更多相關Java鍵盤錄入Scanner類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Springboot項目啟動后自動創(chuàng)建多表關聯(lián)的數(shù)據(jù)庫與表的方案
這篇文章主要介紹了解決Springboot項目啟動后自動創(chuàng)建多表關聯(lián)的數(shù)據(jù)庫與表的方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03java面試散列表及樹所對應容器類及HashMap沖突解決全面分析
這篇文章主要介紹了java面試中的java散列表及樹所對應容器類與HashMap沖突解決的問題總結,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10SpringBoot實現(xiàn)RabbitMQ監(jiān)聽消息的四種方式
本文主要介紹了SpringBoot實現(xiàn)RabbitMQ監(jiān)聽消息的四種方式,包括@RabbitListener,MessageListener接口,MessageListenerAdapter適配器,@RabbitHandler這幾種,感興趣的可以了解一下2024-05-05