首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Scanner 類完整使用指南:從基礎輸入到分隔符自定義

     編輯:Java 相關知識

Scanner 類核心用法

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
    }
}

三步驟核心流程解析

  1. 封裝輸入源:new Scanner(System.in) 可替換為 File、InputStream、Readable 等。
  2. 自定義分隔符:useDelimiter(pattern) 接受正則表達式。預設 \\s+(空白字符),設置為 "\\n" 實現按行讀取。
  3. 判斷與獲取:hasNext() 判斷是否有下一個 token,next() 獲取並移動指針。

常用方法速查表

方法說明
next()獲取下一個字符串 token(按分隔符分割)
nextLine()獲取下一行完整內容(含空格),不受 useDelimiter 影響
nextInt(), nextDouble() 等直接解析為基本類型,失敗拋 InputMismatchException
hasNextInt(), hasNextDouble()預判下一個 token 是否為對應類型
useDelimiter(String pattern)設置分隔符正則
close()關閉掃描器(實現 Closeable)

常見陷阱與最佳實踐

1. next() vs nextLine() 陷阱

Scanner sc = new Scanner("Hello World\nJava");
String a = sc.next();      // "Hello"
String b = sc.nextLine();  // " World" (讀取當前行剩餘內容,含前導空格)
String c = sc.nextLine();  // "Java"

建議:統一使用 nextLine() 讀取整行,再自行分割解析;或僅用 next() 讀取單詞。

2. 關閉 Scanner 導致 System.in 關閉

sc.close() 會關閉底層 System.in,導致後續無法再次讀取控制台輸入。

解決:程序生命周期內只創建一個 Scanner 實例,並在程序結束前關閉;或使用 try-with-resources 但僅在主方法結束時。

3. 文件讀取示例

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)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved