Java Scanner 類
一直以來,我們都使用System.out.println()
方法向屏幕打印內容,那么如何接收輸入的內容呢?本小節所學習的Scanner
類就可以實現對輸入內容的接收。在本小節,我們將學習Scanner
類的定義,如何使用Scanner
類以及其常用方法,在學完這些基礎知識后,我們會在最后學習一個比較有趣的實例程序。
1. 定義
Scanner
是一個簡單的文本掃描器,可以解析基礎數據類型和字符串。
它位于java.util
包下,因此如果要使用此類,必須使用import
語句導入:
import java.util.Scanner;
2. Scanner 對象創建
想要使用Scanner
類就要了解如何創建對象,我們可以使用如下代碼創建一個掃描器對象:
Scanner scanner = new Scanner(System.in);
構造方法的參數System.in
表示允許用戶從系統中讀取內容。本小節,我們的示例代碼中都將使用這個構造方法。
Tips:
System.in
是一個InputStream
類型,Scanner
類還有很多接收其他類型的構造方法。這里不詳細介紹。
3. 常用方法
3.1 next()及其同伴方法
想要獲取用戶的輸入,只有對象是不行的,還要配合它的實例方法。此時配合Scanner
類中的next()
方法及其同伴方法可以獲取指定類型的輸入。
3.1.1 next() 方法
next()
方法的返回值是字符串類型,可以使用此方法,將用戶輸入的內容掃描為字符串。我們來看一個示例,獲取并打印用戶輸入的內容:
import java.util.Scanner;
public class ScannerDemo1 {
public static void main(String[] args) {
// 創建掃描器對象
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入一段內容,輸入回車結束:");
// 可以將用戶輸入的內容掃描為字符串
String str = scanner.next();
// 打印輸出
System.out.println("您輸入的內容為:" + str);
// 關閉掃描器
scanner.close();
}
}
在代碼中我們注意到,在代碼塊的最后調用了close()
方法,這個方法用于關閉當前掃描器,就和電腦的開關機一樣,使用電腦前要開機,而當用不到的時候最好關掉。
編譯執行代碼,屏幕將會提示:
請輸入一段內容,輸入回車結束:
接下來我們按照提示輸入內容,然后輸入回車結束輸入:

3.1.2 同伴方法
那什么是同伴方法呢?這里的同伴方法指的是Scanner
類中以next
單詞開頭的方法。我們舉例來看幾個同伴方法及其作用:
nextLine()
:返回輸入回車之前的所有字符;nextInt()
:將輸入內容掃描為int
類型;nextFloat()
:將輸入內容掃描為float
類型。
這里的nextLine()
方法也可以獲取字符串。我們來看一下它和next()
方法的差異:
next()
方法只有掃描到有效字符后才會結束輸入;而nextLine()
方法可以直接使用回車結束輸入。
另外,next()
方法會自動去掉空白(例如回車、空格等),也不能得到帶有空格的字符串;nextLine()
方法可以得到空白和帶有空格的字符串。
我們再來看一個示例,獲取用戶輸入的姓名、年齡和身高,并且打印輸出:
import java.util.Scanner;
public class ScannerDemo2 {
public static void main(String[] args) {
// 創建掃描器對象
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入您的姓名:");
// 將第一行輸入掃描為字符串
String name = scanner.nextLine();
System.out.println("請輸入您的年齡:");
// 將第二行輸入掃描為int類型
int age = scanner.nextInt();
System.out.println("請輸入您的身高:");
// 將第三行輸入掃描為float類型
float height = scanner.nextFloat();
// 打印掃描器所掃描的值
System.out.println("您的姓名為:" + name);
System.out.println("您的年齡為:" + age);
System.out.println("您的身高為:" + height);
// 關閉掃描器
scanner.close();
}
}
編譯執行代碼,按照提示輸入對應內容,直到程序完整運行:
請輸入您的姓名:
三井 壽
請輸入您的年齡:
19
請輸入您的身高:
183
您的姓名為:三井 壽
您的年齡為:19
您的身高為:183
Tips:上面代碼中,如果使用
next()
方法代替nextLine()
方法來獲取姓名字符串,是無法得到我們輸入的“三井 壽”這個字符串的,這是因為next()
方法不能獲取帶有空格的字符串。
要特別注意的是:Scanner 類讀到的內容,只與輸入順序有關,和終端上顯示的順序無關,因此類似于下面的這種輸入,是讀不到空格的,執行代碼的流程如下:

3.2 hasNext()及其同伴方法
hasNext()
方法的返回值是一個布爾類型,如果輸入中包含數據的輸入,則返回true
。否則返回false
。通常用來做輸入內容的驗證。
它的同伴方法是以hasNext
單詞開頭的方法,諸如hasNextLine()
、hasNextInt()
等方法。例如,上面的代碼中,我們可以對應加入hasNext
同伴方法結合條件判斷語句,來提升代碼的穩定性:
int age;
if (scanner.hasNextInt()) {
age = scanner.nextInt();
} else {
System.out.println("不是int類型");
}
float height;
if (scanner.hasNextFloat()) {
height = scanner.nextFloat();
} else {
System.out.println("不是float類型");
}
4. 實例
前面我們已經對Scanner
類的基本用法有了一定的了解,下面我們來實現一個示例程序,這個程序用于估算一個人的體脂率,這里事先給出體脂率估算公式:
參數a = 腰圍(cm)×0.74
參數b = 體重(kg)× 0.082 + 44.74
脂肪重量(kg)= a - b
體脂率 =(脂肪重量 ÷ 體重)× 100%。
從公式中我們可以看出,想要得到最終的體脂率,參數a(腰圍)和參數 b(體重)是需要用戶手動輸入的,公式部分只需要使用算數運算符實現即可。下面是程序代碼:
import java.util.Scanner;
public class GetBodyFat {
public static void main(String[] args) {
// 初始化腰圍
float waistline = 0f;
// 初始化體重
float weight = 0f;
// 聲明浮點型參數a,b,bodyFatWeight(脂肪重量)
float a, b, bodyFatWeight;
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入您的腰圍(cm):");
if (scanner.hasNextFloat()) {
waistline = scanner.nextFloat();
}
System.out.println("請輸入您的體重(kg):");
if (scanner.hasNextFloat()) {
weight = scanner.nextFloat();
}
// 計算參數a 公式:參數a = 腰圍(cm)× 0.74
a = waistline * 0.74f;
// 計算參數b 公式:參數b = 體重(kg)× 0.082 + 44.74
b = weight * 0.082f + 44.74f;
// 計算脂肪重量
bodyFatWeight = a - b;
// 計算體脂率 =(脂肪重量 ÷ 體重)×100%。
float result = bodyFatWeight / weight * 100;
System.out.println("您的體脂率為" + result + "%");
}
}
編譯運行代碼,按照提示輸入,將估算出你的體脂含量:
請輸入您的腰圍(cm):
70
請輸入您的體重(kg):
50
您的體脂率為5.919998%
執行代碼的流程如下:

5. 小結
本小節我們學習了 Java 的 Scanner
類,它是位于java.util
包下的一個工具類,我們知道了它是一個簡單的文本掃描器,可以解析基礎數據類型和字符串。我們也學會了如何使用Scanner
類來獲取用戶的輸入,next()
方法和nextLine()
方法都可以掃描用戶輸入的字符串,要注意這兩個方法的區別。我們也在最后給出了一個計算體脂率的示例代碼,學習了Scanner
類,你就可以實現比較有意思的一些小程序了。如果你想了解更多有關Scanner
類的接口,也可翻閱官方文檔。