java.util.Scanner 是 Java5的新特徵,咱們能夠經過 Scanner 類來獲取用戶的輸入。java
基本語法:code
Scanner sc = new Scanner(System.in);
經過Scanner類的next()或nextLine()方法獲取輸入的字符串, 在讀取前咱們通常須要 使用 hasNext 與 hasNextLine 判斷是否還有輸入的數據:字符串
next():class
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()方法在後面使用時,注意前面的方法是否含有換行處理。