java.util.Scanner 是 Java 5 引入的簡單文本掃描器,可解析基本類型和字符串。本文通過完整代碼示例講解其核心用法與常見陷阱。
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
System.out.println("請輸入內容,按回車結束(輸入 exit 退出):");
// 1. 封裝 System.in 標準輸入流
try (Scanner sc = new Scanner(System.in)) {
// 2. 設置分隔符為換行符(預設為空白字符:空格、Tab、換行)
sc.useDelimiter("\n");
// 3. 循環判斷是否有下一個 token
while (sc.hasNext()) {
String input = sc.next(); // 獲取下一個 token
if ("exit".equalsIgnoreCase(input.trim())) {
System.out.println("程序退出。");
break;
}
System.out.println("獲取到的值:" + input);
}
} // try-with-resources 自動關閉 Scanner
}
}
new Scanner(System.in) 可替換為 File、InputStream、Readable 等。useDelimiter(pattern) 接受正則表達式。預設 \\s+(空白字符),設置為 "\\n" 實現按行讀取。hasNext() 判斷是否有下一個 token,next() 獲取並移動指針。| 方法 | 說明 |
|---|---|
next() | 獲取下一個字符串 token(按分隔符分割) |
nextLine() | 獲取下一行完整內容(含空格),不受 useDelimiter 影響 |
nextInt(), nextDouble() 等 | 直接解析為基本類型,失敗拋 InputMismatchException |
hasNextInt(), hasNextDouble() | 預判下一個 token 是否為對應類型 |
useDelimiter(String pattern) | 設置分隔符正則 |
close() | 關閉掃描器(實現 Closeable) |
Scanner sc = new Scanner("Hello World\nJava");
String a = sc.next(); // "Hello"
String b = sc.nextLine(); // " World" (讀取當前行剩餘內容,含前導空格)
String c = sc.nextLine(); // "Java"
建議:統一使用 nextLine() 讀取整行,再自行分割解析;或僅用 next() 讀取單詞。
sc.close() 會關閉底層 System.in,導致後續無法再次讀取控制台輸入。
解決:程序生命周期內只創建一個 Scanner 實例,並在程序結束前關閉;或使用 try-with-resources 但僅在主方法結束時。
try (Scanner sc = new Scanner(new File("data.txt"), "UTF-8")) {
sc.useDelimiter(","); // CSV 分隔符
while (sc.hasNext()) {
System.out.println(sc.next().trim());
}
}
Scanner 適合簡單文本解析、控制台交互、小型配置文件讀取。大文件、高性能、二進制解析場景請使用 BufferedReader、Files.lines() 或專業解析庫(如 OpenCSV、Jackson)。