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

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

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

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