Java Scanner用法詳解

注:java

在java中,使用System.out表示標準輸出設備,使用System.in表示標準輸入設備。默認狀況下,輸出設備是現實器,輸入設備是鍵盤。正則表達式

爲完成控制檯輸出,只須要使用println方法就能夠在控制檯上現實基本值或字符串。java並不直接支持控制檯輸入,可使用Scanner類建立它的對象,用以讀取來自System.in的輸入。函數

e.g. Scanner xx = new Scanner( System.in );//建立一個Scanner類型的變量,並將它的引用值賦給變量xxx。Sanner對象的方法spa

一、Java Scanner用法詳解命令行

Java Scanner用法詳解
轉載 2017年02月08日 21:47:10 9535
本文轉載自:
      java中的Scanner
      百度經驗:Java中Scanner類的用法
      Java Scanner類報錯java.util.NoSuchElementException

1、Scanner類簡介
      Java 5添加了java.util.Scanner類,這是一個用於掃描輸入文本的新的實用程序。它是之前的StringTokenizer和Matcher類之間的某種結合。因爲任何數據都必須經過同一模式的捕獲組檢索或經過使用一個索引來檢索文本的各個部分。因而能夠結合使用正則表達式和從輸入流中檢索特定類型數據項的方法。這樣,除了能使用正則表達式以外,Scanner類還能夠任意地對字符串和基本類型(如int和double)的數據進行分析。藉助於Scanner,能夠針對任何要處理的文本內容編寫自定義的語法分析器。

2、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() 
                此掃描器執行當前行,並返回跳過的輸入信息。

3、Scanner類實例
(1)
[java] view plain copy
<span style="font-family:Microsoft YaHei;font-size:14px;">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);  
}  
}</span>  


      運行結果:
      C:\java>java     
      請輸入若干個數,每輸入一個數用回車確認
      最後輸入一個非數字結束輸入操做
      34.13445
      3個數的和爲113.100000
      3個數的平均值是37.700000

(2)
      讀取並分析文本文件:hrinfo.txt,文本文件的內容以下:老趙,28,feb-01,true小竹,22,dec-03,false阿波,21,dec-03,false凱子,25,dec-03,true 程序:
[java] view plain copy
<span style="font-family:Microsoft YaHei;font-size:14px;">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]);  
}  
}</span>  


      運行結果:C:\java>java     readhuman hrinfo.txt
      姓名:老趙 ,年齡:28 ,入司時間:feb-01 ,驗證標記:true
      姓名:小竹 ,年齡:22 ,入司時間:dec-03 ,驗證標記:false
      姓名:阿波 ,年齡:21 ,入司時間:dec-03 ,驗證標記:false
      姓名:凱子,年齡:25 ,入司時間:dec-03 ,驗證標記:true

(3)Scanner默認使用空格做爲分割符來分隔文本,但容許你指定新的分隔符

      使用默認的空格分隔符:
[java] view plain copy
<span style="font-family:Microsoft YaHei;font-size:14px;">        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());   
                }   
        }  
</span>  

      運行結果:

      123 
      asdf 
      sd 
      45 
      789 
      sdf 
      asdfl,sdf.sdfl,asdf 
      ......asdfkl 
      las 

      --將註釋行去掉,使用空格或逗號或點號做爲分隔符,輸出結果以下:
      123 
      asdf 
      sd 
      45 
      789 
      sdf 
      asdfl 
      sdf 
      sdfl 
      asdf 


      asdfkl 

      las 

4、Scanner報錯:java.util.NoSuchElementException
      【問題描述】代碼以下:
      
[java] view plain copy
<span style="font-family:Microsoft YaHei;font-size:14px;">String str1 = input1.nextLine();  
      input1.close();  
      Scanner input2 = new Scanner(System.in);  
      String str2 = input2.nextLine();  
      input2.close();</span>  

      【報錯緣由】在第二次使用Scanner以前調用了close方法。而在關閉的時候,會把System.in也關閉了。當下次new一個讀取的時候,由於輸入流已經關閉,因此讀取的值就是-1;在Scanner 的readinput方法裏面有如下代碼。
[java] view plain copy
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方法裏面有如下代碼:


[java] view plain copy
if (needInput)  
                readInput();  
            else  
                throwFor();  

      當needinput爲false,就執行throwFor,所以再看throwFor
[java] view plain copy
<span style="font-family:Microsoft YaHei;font-size:14px;">skipped = false;  
        if ((sourceClosed) && (position == buf.limit()))  
            throw new NoSuchElementException();  
        else  
            throw new InputMismatchException();</span>  

      position 是當前讀取的內容在緩衝區中位置,由於讀取的是-1,所以position =0,而buf.limit()也等於0,所以就執行了throw new NoSuchElementException();

      【解決方案】將input1.close()放在input2.close()之上便可。
相關文章
相關標籤/搜索