一、Scanner類簡介
Java 5添加了java.util.Scanner類,這是一個用于掃描輸入文本的新的實用程序。它是以前的StringTokenizer和Matcher類之間的某種結合。由于任何數據都必須通過同一模式的捕獲組檢索或通過使用一個索引來檢索文本的各個部分。于是可以結合使用正則表達式和從輸入流中檢索特定類型數據項的方法。這樣,除了能使用正則表達式之外,Scanner類還可以任意地對字符串和基本類型(如int和double)的數據進行分析。借助于Scanner,可以針對任何要處理的文本內容編寫自定義的語法分析器。
二、Scanner類用法
Scanner是SDK1.5新增的一個類,可使用該類創建一個對象。
Scanner reader=new Scanner(System.in);
然后reader對象調用下列方法(函數),讀取用戶在命令行輸入的各種數據類型
next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot()
上述方法執行時都會造成堵塞,等待用戶在命令行輸入數據回車確認.例如,擁護在鍵盤輸入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false。NextLine()等待用戶輸入一個文本行并且回車,該方法得到一個String類型的數據。
Scanner的構造器支持多種方式,可以從字符串(Readable)、輸入流、文件等等來直接構建Scanner對象,有了Scanner了,就可以逐段(根據正則分隔式)來掃描整個文本,并對掃描后的結果做想要的處理。
下面是一些API函數的用法:
delimiter() :返回此 Scanner 當前正在用于匹配分隔符的 Pattern。
hasNext() :判斷掃描器中當前掃描位置后是否還存在下一段。(原APIDoc的注釋很扯淡)
hasNextLine() :如果在此掃描器的輸入中存在另一行,則返回 true。
next() :查找并返回來自此掃描器的下一個完整標記。
nextLine() :此掃描器執行當前行,并返回跳過的輸入信息。
三、Scanner類實例
(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.*; public class Example { public static void main(String args[]) { System.out.println( "請輸入若干個數,每輸入一個數用回車確認" ); System.out.println( "最后輸入一個非數字結束輸入操作" ); 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個數的和為%f\n" ,m,sum); System.out.printf( "%d個數的平均值是%f\n" ,m,sum/m); } } |
? ?運行結果:
C:\java>java
請輸入若干個數,每輸入一個數用回車確認
最后輸入一個非數字結束輸入操作
34.13445
3個數的和為113.100000
3個數的平均值是37.700000
(2)讀取并分析文本文件:hrinfo.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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參數以讀取不同分隔符分隔的內容 String name = linescanner.next(); int age = linescanner.nextInt(); String idate = linescanner.next(); boolean iscertified = linescanner.nextBoolean(); System.out.println( "姓名:" +name+ " ,年齡:" + age+ " ,入司時間:" + idate+ " ,驗證標記:" +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 ]); } } |
運行結果:C:\java>java readhuman hrinfo.txt
姓名:老趙 ,年齡:28 ,入司時間:feb-01 ,驗證標記:true
姓名:小竹 ,年齡:22 ,入司時間:dec-03 ,驗證標記:false
姓名:阿波 ,年齡:21 ,入司時間:dec-03 ,驗證標記:false
姓名:凱子,年齡:25 ,入司時間:dec-03 ,驗證標記:true
(3)Scanner默認使用空格作為分割符來分隔文本,但允許你指定新的分隔符
使用默認的空格分隔符:
1
2
3
4
5
6
7
|
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()); } } |
運行結果:
123
asdf
sd
45
789
sdf
asdfl,sdf.sdfl,asdf
......asdfkl
las
--將注釋行去掉,使用空格或逗號或點號作為分隔符,輸出結果如下:
123
asdf
sd
45
789
sdf
asdfl
sdf
sdfl
asdf
asdfkl
las
四、Scanner報錯:java.util.NoSuchElementException
【問題描述】代碼如下:
1
2
3
4
5
|
String str1 = input1.nextLine(); input1.close(); Scanner input2 = new Scanner(System.in); String str2 = input2.nextLine(); input2.close(); |
【報錯原因】在第二次使用Scanner之前調用了close方法。而在關閉的時候,會把System.in也關閉了。當下次new一個讀取的時候,因為輸入流已經關閉,所以讀取的值就是-1;在Scanner 的readinput方法里面有以下代碼。
1
2
3
4
5
6
7
8
9
10
11
|
try { n = source.read(buf); } catch (IOException ioe) { lastException = ioe; n = - 1 ; } if (n == - 1 ) { sourceClosed = true ; needInput = false ; } |
因為讀到了-1就設置sourceClosed =true;neepinput=false; 在next方法里面有以下代碼:
1
2
3
4
|
if (needInput) readInput(); else throwFor(); |
當needinput為false,就執行throwFor,因此再看throwFor
1
2
3
4
5
|
skipped = false ; if ((sourceClosed) && (position == buf.limit())) throw new NoSuchElementException(); else throw new InputMismatchException(); |
position 是當前讀取的內容在緩沖區中位置,因為讀取的是-1,因此position =0,而buf.limit()也等于0,因此就執行了throw new NoSuchElementException();
【解決方案】將input1.close()放在input2.close()之上即可。
到此這篇關于Java Scanner用法案例詳解的文章就介紹到這了,更多相關Java Scanner用法內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/gongxifacai_believe/article/details/54933287