java的scanner用法_Java Scanner用法详解
一、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()
此掃描器執行當前行,并返回跳過的輸入信息。
此處重點講一下next()和nextLine()的區別
next():只讀取輸入直到空格。它不能讀兩個由空格或符號隔開的單詞。此外,next()在讀取輸入后將光標放在同一行中。(next()只讀空格之前的數據,并且光標指向本行)
nextLine():讀取輸入,包括單詞之間的空格和除回車以外的所有符號(即。它讀到行尾)。讀取輸入后,nextLine()將光標定位在下一行
三、Scanner類實例
(1)
1 import java.util.*;2
3 public classdemo {4 public static voidmain(String args[]) {5 System.out.println("請輸入若干個數,每輸入一個數用回車確認");6 System.out.println("最后輸入一個非數字結束輸入操作");7 Scanner reader = newScanner(System.in);8 double sum = 0;9 int m = 0;10 while(reader.hasNextDouble()) {11 double x =reader.nextDouble();12 m = m + 1;13 sum = sum +x;14 }15 System.out.printf("%d個數的和為%f\n", m, sum);16 System.out.printf("%d個數的平均值是%f\n", m, sum /m);17 reader.close();18 }19 }
運行結果:
請輸入若干個數,每輸入一個數用回車確認
最后輸入一個非數字結束輸入操作7.8
6.6
3end
3個數的和為17.4000003個數的平均值是5.800000
(2)Scanner默認使用空格作為分割符來分隔文本,但允許你指定新的分隔符
使用默認的空格分隔符:
1 importjava.util.Scanner;2
3 public classdemo {4 public static voidmain(String[] args) {5 Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las");6 //s.useDelimiter(" |,|\\.");
7 while(s.hasNext()) {8 System.out.println(s.next());9 }10 }11 }
運行結果:
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
【問題描述】代碼如下:
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 try{2 n =source.read(buf);3 } catch(IOException ioe) {4 lastException =ioe;5 n = -1;6 }7
8 if (n == -1) {9 sourceClosed = true;10 needInput = false;11 }
因為讀到了-1就設置sourceClosed =true;neepinput=false;
在next方法里面有以下代碼:
1 if(needInput)2 readInput();3 else
4 throwFor();
當needinput為false,就執行throwFor,因此再看throwFor
1 skipped = false;2 if ((sourceClosed) && (position ==buf.limit()))3 throw newNoSuchElementException();4 else
5 throw new InputMismatchException();
position 是當前讀取的內容在緩沖區中位置,因為讀取的是-1,因此position =0,而buf.limit()也等于0,因此就執行了throw new NoSuchElementException();
【解決方案】將input1.close()放在input2.close()之上即可。
總結
以上是生活随笔為你收集整理的java的scanner用法_Java Scanner用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年85马力农用拖拉机价格多少,国
- 下一篇: java定义list长度,在Java中定