Scanner 類

Java Scanner 類

java.util.Scanner 是 Java5的新特徵,咱們能夠經過 Scanner 類來獲取用戶的輸入。java

基本語法:code

Scanner sc = new Scanner(System.in);

經過Scanner類的next()或nextLine()方法獲取輸入的字符串, 在讀取前咱們通常須要 使用 hasNext 與 hasNextLine 判斷是否還有輸入的數據:字符串

next() 與 nextLine() 區別

next():class

  • 必定要讀取到有效字符後才能夠結束輸入。
  • 對輸入有效字符以前遇到的空白,next() 方法會自動將其去掉。
  • 只有輸入有效字符後纔將其後面輸入的空白做爲分隔符或者結束符。
  • next() 不能獲得帶有空格的字符串。

nextLine():import

  • 以Enter爲結束符,也就是說 nextLine()方法返回的是輸入回車以前的全部字符。數據類型

  • 能夠得到空白。語法

使用 next 方法:float

import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] args) {
        //首先建立一個掃描器,用於接收鍵盤數據
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入數據:");
        if (sc.hasNext()) {
            String str = sc.next();
            System.out.println("收到的數據爲:" + str);
        }
        sc.close();
    }
}

結果方法

請輸入數據:
hello world
收到的數據爲:hello

使用 next 方法:im

import java.util.Scanner;

public class ScannerNextLine {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入數據:");
        if (sc.hasNextLine()) {
            String str = sc.nextLine();
            System.out.println("收到的數據爲:" + str);
        }
        sc.close();
    }
}

結果

請輸入數據:
hello world
收到的數據爲:hello world

輸入基本數據類型

若是要輸入 int 或 float 類型的數據,在 Scanner 類中也有支持,

可是在輸入以前最好先使用 hasNextXxx() 方法進行驗證,再使用 nextXxx() 來讀取:

好比輸入int類型的數據

if (sc.hasNextInt()) {
    int i = sc.nextInt();
    System.out.println("收到的數據爲:" + i);
}

練習

輸入多個數字,並求其總和與平均數,經過輸入非數字來結束輸入並輸出執行結果:

import java.util.Scanner;

public class Sum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sum = 0;
        int count = 0;
        while (sc.hasNextInt()) {
            int num = sc.nextInt();
            sum += num;
            count++;
        }
        System.out.println("總和:" + sum);
        System.out.println("平均:" + (1.0 * sum / count));

        sc.close();
    }
}

結果·

1 2 3 4 5 q
總和:15
平均:3.0

注意

當使用nextLine()方法以前,使用過其餘的方法,須要多使用一次nextLine()方法

以下代碼,先輸入一個年齡,再輸入姓名

import java.util.Scanner;

public class ScannerBug {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = 0;
        String str = null;
        if (sc.hasNextInt()) {
            num = sc.nextInt();
        }
        if (sc.hasNextLine()) {
            str = sc.nextLine();
        }
        System.out.println("---------輸出結果-------");
        System.out.println("年齡" + num);
        System.out.println("姓名" + str);

        sc.close();
    }
}

結果

18
---------輸出結果-------
年齡18
姓名

分析

在輸入18按下回車以後,直接打印結果。跳過了姓名的輸入,不妨試試使用空格分離輸入的參數。

18 ljh
---------輸出結果-------
年齡18
姓名 ljh

發現姓名後面多了個空格纔打印輸入的名字,說明nextInt()方法只讀取到18。

18日後的數據都被nextLine()接收,正好nextLine()方法能夠接收空白,因此包含了空格。

若是將nextLine()方法改爲next()方法,不包含空白,能夠解決以上問題。

package com.study.scanner;

import java.util.Scanner;

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

        int num = 0;
        String str = null;
        if (sc.hasNextInt()) {
            num = sc.nextInt();
        }

        if (sc.hasNext()) {
            str = sc.next();
        }

        System.out.println("---------輸出結果-------");
        System.out.println("年齡" + num);
        System.out.println("姓名" + str);

        sc.close();
    }
}

結果

18 ljh
---------輸出結果-------
年齡18
姓名ljh


18
ljh
---------輸出結果-------
年齡18
姓名ljh

那麼就是要求nextLine()讀取下一行數據怎麼辦呢?

如新增一個需求再讀取一個電話號碼,要求區號和尾號用空格隔開

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

        int num = 0;
        String str = null;
        String phone = null;
        if (sc.hasNextInt()) {
            num = sc.nextInt();
        }
        if (sc.hasNext()) {
            str = sc.next();
        }
        if (sc.hasNextLine()) {
            phone = sc.nextLine();
        }
        System.out.println("---------輸出結果-------");
        System.out.println("年齡" + num);
        System.out.println("姓名" + str);
        System.out.println("電話" + phone);

        sc.close();
    }
}

結果

18
ljh
---------輸出結果-------
年齡18
姓名ljh
電話


18 ljh 0771 1234
---------輸出結果-------
年齡18
姓名ljh
電話 0771 1234

兩種輸入方式,第一種 nextLine()方法又讀取了ljh後面的數據,致使第三個數據不能輸入。

第二種輸入方式多了個空格

考慮應該把ljh後面的數據給吃掉。再接收第三個數據

import java.util.Scanner;

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

        int num = 0;
        String str = null;
        String phone = null;
        if (sc.hasNextInt()) {
            num = sc.nextInt();
        }

        if (sc.hasNext()) {
            str = sc.next();
        }

        if (sc.hasNextLine()) {
            sc.nextLine();// 去除前一行多餘的數據
            phone = sc.nextLine();
        }

        System.out.println("---------輸出結果-------");
        System.out.println("年齡" + num);
        System.out.println("姓名" + str);
        System.out.println("電話" + phone);

        sc.close();
    }
}

結果

18
ljh
0771 1234
---------輸出結果-------
年齡18
姓名ljh
電話0771 1234

最終達到想要的效果。

總結

nextXxx()方法只讀取到相應的數值就中止,不含換行操做。

nextLine()方法在後面使用時,注意前面的方法是否含有換行處理。

相關文章
相關標籤/搜索