1. 程式人生 > >Java中的 Scanner簡述(企業筆試線上程式設計的輸入控制)

Java中的 Scanner簡述(企業筆試線上程式設計的輸入控制)

摘要:

  最近進行企業線上筆試時,發現企業的筆試平臺大都使用賽碼網(雖然槽點很多),而且線上程式設計都需要使用Scanner來讀取程式的輸入,因此,筆者就在先輩們的成果上對Scanner做了一份全新的、詳細的總結。我們知道,java.util.Scanner是Java5的新特徵,主要功能是簡化文字掃描。這個類最實用的地方表現在獲取控制檯輸入,其他的功能都很雞肋,儘管Java API文件中列舉了大量的API方法,但是都不怎麼地,特此簡述。

一. 掃描控制檯輸入

  這個例子是常常會用到,但是如果沒有Scanner,你寫寫就知道多難受了。在這個例子中,通過new Scanner(System.in)建立一個Scanner,控制檯會一直等待輸入,直到敲回車鍵結束,把所輸入的內容傳給Scanner,作為掃描物件。如果要獲取輸入的內容,則只需要呼叫Scanner的nextLine()方法即可。

/** 
* 掃描控制檯輸入 
* 
*/ 
public class TestScanner { 
        public static void main(String[] args) { 
                Scanner s = new Scanner(System.in); 
                System.out.println("請輸入字串:"); 
                while (true) { 
                        String line = s.nextLine(); 
                        if
(line.equals("exit")) break; System.out.println(">>>" + line); } } }/* Output(): 請輸入字串: 234 >>>234 wer >>>wer bye >>>bye *///

二. Scanner的便捷性

  如果說Scanner使用簡便,不如說Scanner的構造器支援多種方式,構建Scanner的物件很方便。

我們可以從字串(Readable)、輸入流、檔案等等來直接構建Scanner物件,有了Scanner了,就可以 逐段(根據正則分隔式)來掃描整個文字,並對掃描後的結果做特定的處理。

三. Scanner分隔符

  Scanner 預設使用空格作為分隔符來分隔文字,但允許我們通過使用方法useDelimiter(String pattern)指定新的分隔符特別需要注意的是,方法useDelimiter(String pattern)的引數是一個正則表示式字串,若想指定多個分隔符來分割,須使用”|”將它們隔開。如下所示:

public static void test7() {
    Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf    ......asdfkl    las");
    s.useDelimiter(" |,|\\.");    // 將使用空格,逗號和點號來分割Scanner輸入
    while (s.hasNext()) {
        System.out.println(s.next());
    }
}/* Output(): 
        123
        asdf
        sd
        45
        789
        sdf
        asdfl
        sdf
        sdfl
        asdf









        asdfkl



        las
 *///

四、Scanner常用API剖析和使用例項

  現列舉Java中關於Scanner比較常用的幾個API:

  • delimiter()
      返回此 Scanner 當前正在用於匹配分隔符的 Pattern。

  • hasNext()
      判斷掃描器中當前掃描位置後是否還存在下一段,預設以一個或多個連續的空格作為段的分隔符。

  • hasNextLine()
      如果在此掃描器的輸入中存在另一行(以回車作為”分行符”),則返回 true。

  • next()
      查詢並返回來自此掃描器的下一個完整標記(取得輸入段)。

  • nextLine()
      此掃描器執行當前行,並返回跳過的輸入資訊(取得輸入行文字)。

Scanner使用例項 (主要針對筆試程式設計中的多行輸入和單行輸入)

1). hasNextLine() 和 nextLine() 的用法

public class TestScanner1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 正則表示式字串
        //scanner.useDelimiter("\\*");

        System.out.println("請輸入字串:");

        // test1(scanner);
         test2(scanner);
        // test3(scanner);
    }


    /**
     * @description 以行(回車)讀取,每在控制檯輸入三行則列印一次;不夠三行,則阻塞等待
     * @author rico
     * @created 2017年4月5日 上午10:31:14
     * @param scanner
     */
    public static void test1(Scanner scanner) {
        while (true) {      // scanner 不斷從控制檯讀取,若無內容,則阻塞等待

            // 以行讀取
            String s1 = scanner.nextLine();
            String s2 = scanner.nextLine();
            String s3 = scanner.nextLine();

            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }


    /**
     * @description 以行(回車)讀取,每在控制檯輸入三行則列印一次;不夠三行,則阻塞等待(與方法test1等效)
     * @author rico
     * @created 2017年4月5日 上午10:31:14
     * @param scanner
     */
    public static void test2(Scanner scanner) {
        while (scanner.hasNextLine()) {        // 一旦控制檯有輸入,scanner就開始從控制檯讀取

            // 以行讀取
            String s1 = scanner.nextLine();
            String s2 = scanner.nextLine();
            String s3 = scanner.nextLine();

            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }


    /**
     * @description 以行讀取,每敲一次回車鍵讀取一次,不會忽略空格
     * @author rico
     * @created 2017年4月5日 上午10:31:14
     * @param scanner
     */
    public static void test3(Scanner scanner) {
        while (scanner.hasNextLine()) {  // 一旦控制檯有輸入,scanner就開始從控制檯讀取
            String s1 = scanner.nextLine();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s1.length());
        }
    }

             Scanner1.png-14.7kB

2). hasNext() 和 next() 的用法

public class TestScanner1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 正則表示式字串
        //scanner.useDelimiter("\\*");

        System.out.println("請輸入字串:");


        // test4(scanner);
        test5(scanner);
        //test6(scanner);
    }

    /**
     * @description 預設以一個或多個空格作為分割符來分隔行文字,每三個作為一組輸出一次(不夠三個則阻塞等待,直到夠三個才作為一組進行輸出);此外,連續輸入三行(每行一個)也可以。
     * @author rico
     * @created 2017年4月5日 上午10:37:54
     * @param scanner
     */
    public static void test4(Scanner scanner) {
        while (true) {   // scanner 不斷從控制檯讀取,若無內容,則阻塞等待
            String s1 = scanner.next();
            String s2 = scanner.next();
            String s3 = scanner.next();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }


    /**
     * @description 以一個或多個空格作為分割符來分隔行文字,每三個作為一組輸出一次(不夠三個則阻塞等待,直到夠三個才作為一組進行輸出);此外,連續輸入三行(每行一個)也可以。
     * @author rico
     * @created 2017年4月5日 上午10:49:22
     * @param scanner
     */
    public static void test5(Scanner scanner) {
        while (scanner.hasNext()) {    // 一旦控制檯有輸入,scanner就開始從控制檯讀取
            String s1 = scanner.next();
            String s2 = scanner.next();
            String s3 = scanner.next();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }

    /**
     * @description 以一個或多個空格作為分割符來分隔行文字,以一個作為一組進行輸出(所有的空格均為分割符),有幾個就輸出幾個
     * @author rico
     * @created 2017年4月5日 上午10:37:54
     * @param scanner
     */
    public static void test6(Scanner scanner) {
        System.out.println(scanner.delimiter());
        while (true) {     // scanner 不斷從控制檯讀取,若無內容,則阻塞等待
            String s1 = scanner.next();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s1.length());
        }
    }

             scanner.png-42.7kB

3). nextLine() 與 next() 的區別

  • nextLine():以回車作為換行標誌;

  • next() :以一個或多個空格作為分段標誌,也可以以回車作為分段標誌(如上圖所示)。

五. Scanner 掃描檔案輸入

  看下面例子完成了使用Scanner 掃描檔案輸入:

 public static void main(String[] args) throws FileNotFoundException { 
    InputStream in = new FileInputStream(new File("C:\\AutoSubmit.java")); // 建立檔案輸入流
    Scanner s = new Scanner(in); 
    while(s.hasNextLine()){ 
        System.out.println(s.nextLine()); 
    } 
}/* Output(): 
        package own; 

        import java.io.BufferedReader; 
        import java.io.BufferedWriter; 
        import java.io.InputStream; 
        import java.io.InputStreamReader; 
        import java.io.OutputStreamWriter; 
        import java.net.HttpURLConnection; 
        import java.net.ProtocolException; 
        import java.net.URL; 

        import com.verisign.uuid.UUID; 

        /** 
        * @author wangpeng 
        * 
        */
        ...
 *///