Java Scanner用法案例詳解
一、Scanner類(lèi)簡(jiǎn)介
Java 5添加了java.util.Scanner類(lèi),這是一個(gè)用于掃描輸入文本的新的實(shí)用程序。它是以前的StringTokenizer和Matcher類(lèi)之間的某種結(jié)合。由于任何數(shù)據(jù)都必須通過(guò)同一模式的捕獲組檢索或通過(guò)使用一個(gè)索引來(lái)檢索文本的各個(gè)部分。于是可以結(jié)合使用正則表達(dá)式和從輸入流中檢索特定類(lèi)型數(shù)據(jù)項(xiàng)的方法。這樣,除了能使用正則表達(dá)式之外,Scanner類(lèi)還可以任意地對(duì)字符串和基本類(lèi)型(如int和double)的數(shù)據(jù)進(jìn)行分析。借助于Scanner,可以針對(duì)任何要處理的文本內(nèi)容編寫(xiě)自定義的語(yǔ)法分析器。
二、Scanner類(lèi)用法
Scanner是SDK1.5新增的一個(gè)類(lèi),可使用該類(lèi)創(chuàng)建一個(gè)對(duì)象。
Scanner reader=new Scanner(System.in);
然后reader對(duì)象調(diào)用下列方法(函數(shù)),讀取用戶在命令行輸入的各種數(shù)據(jù)類(lèi)型
next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot()
上述方法執(zhí)行時(shí)都會(huì)造成堵塞,等待用戶在命令行輸入數(shù)據(jù)回車(chē)確認(rèn).例如,擁護(hù)在鍵盤(pán)輸入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false。NextLine()等待用戶輸入一個(gè)文本行并且回車(chē),該方法得到一個(gè)String類(lèi)型的數(shù)據(jù)。
Scanner的構(gòu)造器支持多種方式,可以從字符串(Readable)、輸入流、文件等等來(lái)直接構(gòu)建Scanner對(duì)象,有了Scanner了,就可以逐段(根據(jù)正則分隔式)來(lái)掃描整個(gè)文本,并對(duì)掃描后的結(jié)果做想要的處理。
下面是一些API函數(shù)的用法:
delimiter() :返回此 Scanner 當(dāng)前正在用于匹配分隔符的 Pattern。
hasNext() :判斷掃描器中當(dāng)前掃描位置后是否還存在下一段。(原APIDoc的注釋很扯淡)
hasNextLine() :如果在此掃描器的輸入中存在另一行,則返回 true。
next() :查找并返回來(lái)自此掃描器的下一個(gè)完整標(biāo)記。
nextLine() :此掃描器執(zhí)行當(dāng)前行,并返回跳過(guò)的輸入信息。
三、Scanner類(lèi)實(shí)例
(1)
import java.util.*; public class Example { public static void main(String args[]) { System.out.println("請(qǐng)輸入若干個(gè)數(shù),每輸入一個(gè)數(shù)用回車(chē)確認(rèn)"); System.out.println("最后輸入一個(gè)非數(shù)字結(jié)束輸入操作"); Scanner reader=new Scanner(System.in); double sum=0; int m=0; while(reader.hasNextDouble()) { double x=reader.nextDouble(); m=m+1; sum=sum+x; } System.out.printf("%d個(gè)數(shù)的和為%f\n",m,sum); System.out.printf("%d個(gè)數(shù)的平均值是%f\n",m,sum/m); } }
運(yùn)行結(jié)果:
C:\java>java
請(qǐng)輸入若干個(gè)數(shù),每輸入一個(gè)數(shù)用回車(chē)確認(rèn)
最后輸入一個(gè)非數(shù)字結(jié)束輸入操作
34.13445
3個(gè)數(shù)的和為113.100000
3個(gè)數(shù)的平均值是37.700000
(2)讀取并分析文本文件:hrinfo.txt
import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; public class readhuman { private static void readfile(String filename) { try { Scanner scanner = new Scanner(new File(filename)); scanner.useDelimiter(System.getProperty("line.separator")); while (scanner.hasNext()) { parseline(scanner.next()); } scanner.close(); }catch (FileNotFoundException e) { System.out.println(e); } } private static void parseline(String line) { Scanner linescanner = new Scanner(line); linescanner.www.gzlij.com useDelimiter(","); //可以修改usedelimiter參數(shù)以讀取不同分隔符分隔的內(nèi)容 String name = linescanner.next(); int age = linescanner.nextInt(); String idate = linescanner.next(); boolean iscertified = linescanner.nextBoolean(); System.out.println("姓名:"+name+" ,年齡:"+ age+" ,入司時(shí)間:"+ idate+" ,驗(yàn)證標(biāo)記:"+iscertified ); } public static void main(String[] args) { if (args.length != 1) { System.err.println("usage: java readhuman file location"); System.exit(0); } readfile(args[0]); } }
運(yùn)行結(jié)果:C:\java>java readhuman hrinfo.txt
姓名:老趙 ,年齡:28 ,入司時(shí)間:feb-01 ,驗(yàn)證標(biāo)記:true
姓名:小竹 ,年齡:22 ,入司時(shí)間:dec-03 ,驗(yàn)證標(biāo)記:false
姓名:阿波 ,年齡:21 ,入司時(shí)間:dec-03 ,驗(yàn)證標(biāo)記:false
姓名:凱子,年齡:25 ,入司時(shí)間:dec-03 ,驗(yàn)證標(biāo)記:true
(3)Scanner默認(rèn)使用空格作為分割符來(lái)分隔文本,但允許你指定新的分隔符
使用默認(rèn)的空格分隔符:
public static void main(String[] args) throws FileNotFoundException { Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las"); // s.useDelimiter(" |,|\\."); while (s.hasNext()) { System.out.println(s.next()); } }
運(yùn)行結(jié)果:
123
asdf
sd
45
789
sdf
asdfl,sdf.sdfl,asdf
......asdfkl
las
--將注釋行去掉,使用空格或逗號(hào)或點(diǎn)號(hào)作為分隔符,輸出結(jié)果如下:
123
asdf
sd
45
789
sdf
asdfl
sdf
sdfl
asdf
asdfkl
las
四、Scanner報(bào)錯(cuò):java.util.NoSuchElementException
【問(wèn)題描述】代碼如下:
String str1 = input1.nextLine(); input1.close(); Scanner input2 = new Scanner(System.in); String str2 = input2.nextLine(); input2.close();
【報(bào)錯(cuò)原因】在第二次使用Scanner之前調(diào)用了close方法。而在關(guān)閉的時(shí)候,會(huì)把System.in也關(guān)閉了。當(dāng)下次new一個(gè)讀取的時(shí)候,因?yàn)檩斎肓饕呀?jīng)關(guān)閉,所以讀取的值就是-1;在Scanner 的readinput方法里面有以下代碼。
try { n = source.read(buf); } catch (IOException ioe) { lastException = ioe; n = -1; } if (n == -1) { sourceClosed = true; needInput = false; }
因?yàn)樽x到了-1就設(shè)置sourceClosed =true;neepinput=false; 在next方法里面有以下代碼:
if (needInput) readInput(); else throwFor();
當(dāng)needinput為false,就執(zhí)行throwFor,因此再看throwFor
skipped = false; if ((sourceClosed) && (position == buf.limit())) throw new NoSuchElementException(); else throw new InputMismatchException();
position 是當(dāng)前讀取的內(nèi)容在緩沖區(qū)中位置,因?yàn)樽x取的是-1,因此position =0,而buf.limit()也等于0,因此就執(zhí)行了throw new NoSuchElementException();
【解決方案】將input1.close()放在input2.close()之上即可。
到此這篇關(guān)于Java Scanner用法案例詳解的文章就介紹到這了,更多相關(guān)Java Scanner用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中常用阻塞隊(duì)列的問(wèn)題小結(jié)
這篇文章主要介紹了Java常用阻塞隊(duì)列問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01MyBatis詳解如何實(shí)現(xiàn)Dao層接口
MyBatis允許只聲明一個(gè)dao接口,而無(wú)需寫(xiě)dao實(shí)現(xiàn)類(lèi)的方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。前提是必須保證Mapper文件中的<mapper>標(biāo)簽的namespace屬性值必須要和dao接口的類(lèi)路徑一致,MyBatis容器會(huì)自動(dòng)通過(guò)動(dòng)態(tài)代理生成接口的實(shí)現(xiàn)類(lèi)2022-04-04Java中Quartz高可用定時(shí)任務(wù)快速入門(mén)
如果你想做定時(shí)任務(wù),有高可用方面的需求,或者僅僅想入門(mén)快,上手簡(jiǎn)單,那么選用它準(zhǔn)沒(méi)錯(cuò),感興趣的小伙伴們可以參考一下2022-04-04Java Web導(dǎo)出等比例圖片到Excel的實(shí)現(xiàn)過(guò)程
我們使用Java導(dǎo)出圖片到Excel,打開(kāi)成功導(dǎo)出的Excel一看,商品對(duì)應(yīng)的圖片都很規(guī)矩的按照我的設(shè)置鋪滿了整個(gè)單元格,但是,商品圖片卻都變形了,這樣肯定是不行的,于是第一反應(yīng)就是將圖片等比例導(dǎo)出,所以本文本給大家介紹了如何使用Java Web導(dǎo)出等比例圖片到Excel2023-11-11Spring?boot數(shù)據(jù)庫(kù)依賴詳解
這篇文章主要介紹了Spring?boot數(shù)據(jù)庫(kù)依賴,需要的朋友可以參考下2023-09-092020.2 IntelliJ IDEA激活與IDEA2020.2破解詳細(xì)教程
這篇文章主要介紹了2020.2 IntelliJ IDEA激活與IDEA2020.2破解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法,結(jié)合實(shí)例形式分析了Spring設(shè)置普通屬性值的方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-11-11Unicode、UTF-8 和 ISO8859-1區(qū)別解析
這篇文章主要介紹了Unicode、UTF-8 和 ISO8859-1到底有什么區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01