天天看點

使用Scanner類完成資料輸入 | 帶你學《Java語言進階特性》之六十八

上一篇:使用緩沖輸入流優化資料輸入能力 | 帶你學《Java語言進階特性》之六十七

Scanner類是JDK1.5以後出現的用于解決輸入流處理問題的程式類,在整體設計上優于之前版本的BufferedReader類,本節将詳細介紹Scanner類的相關内容。

【本節目标】

通過閱讀本節内容,你将了解到Scanner類内提供的相關方法及其功能,學會使用Scanner類輸入字元串、數字、生日等資訊以及使用Scanner類讀取檔案資訊,對程式IO擁有一個較為全面的認識。

Scanner類

java.util.Scanner是從JDK1.5之後追加的一個程式類,其主要的目的解決輸入流的通路問題的,可以了解為BufferedReader的替代功能類,在Scanner類裡面有如下幾種操作方法:

  • 構造:public Scanner(InputStream source);
  • 判斷是否有資料:public boolean hasNext();
  • 取出資料:public String next();
  • 設定分隔符:public Scanner useDelimiter(String pattern);

範例:使用Scanner實作鍵盤資料輸入

import java.util.Scanner;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.println("請輸入年齡:");
        if (scan.hasNextInt()) {    //判斷是否有整數輸入
            int age = scan.nextInt() ;   //直接擷取數字
            System.out.println("您的年齡:" + age);
        } else {
            System.out.println("咋看不懂呢?輸入的是年齡。");
        }
        scan.close();
    }
}           

此時可以明顯的感受到Scanner的處理會更加的簡單。

範例:輸入一個字元串

import java.util.Scanner;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.println("請輸入資訊:");
        if (scan.hasNext()) {
            String msg = scan.next();
            System.out.println("輸入資訊為:" + msg);
        }
        scan.close();
    }
}           

使用Scanner輸入資料還有一個最大的的特點是可以直接利用正則進行驗證判斷。

範例:輸入一個人的生日(yyyy-MM-dd)

import java.util.Scanner;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.println("請輸入您的生日:");
        if (scan.hasNext("\\d{4}-\\d{2}-\\d{2}")) {
            String str = scan.next("\\d{4}-\\d{2}-\\d{2}");
            System.out.println("輸入資訊為:" + new SimpleDateFormat("yyyy-MM-dd").parse(str));//換行不算輸入
        } 
        scan.close();
    }
}           

現在可以發現Scanner的整體設計要好于BufferedReader,而且要比直接使用InputStream類讀取要友善。例如,現在如果要讀取一個文本檔案中的所有内容資訊,如果采用的是InputStream類,那麼就必須依靠記憶體輸出流,進行臨時資料的儲存,之後還需要判斷讀取的内容是否是換行。

範例:使用Scanner讀取

import java.io.File;
import java.util.Scanner;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(new File("D:" + File.separator + "mldn-info.txt"));
        scan.useDelimiter("\n");//設定讀取分隔符
        while (scan.hasNext()) {
            System.out.println(scan.next());
        }
        scan.close();
    }
}           

在以後的開發過程之中,如果程式需要輸出資料一定使用列印流,輸入資料使用Scanner(BufferedReader)。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:使用Serializable實作類對象序列化能力 | 帶你學《Java語言進階特性》之六十九 更多Java面向對象程式設計文章檢視此處