Java?Scanner?類最佳實踐
在 Java 編程中,Scanner
類是處理用戶輸入的重要工具,它提供了強(qiáng)大而靈活的文本解析能力。本文將深入解析Scanner
類的核心功能、使用場景及最佳實踐,幫助開發(fā)者高效處理控制臺輸入、文件讀取等場景。
一、Scanner 類的核心功能
Scanner
類位于java.util
包下,主要用于從各種輸入源(如標(biāo)準(zhǔn)輸入、文件、字符串等)解析基本數(shù)據(jù)類型和字符串。其核心功能包括:
- 基本數(shù)據(jù)類型解析:支持讀取
int
、double
、boolean
等基本類型 - 字符串解析:按行或按分隔符讀取字符串
- 自定義分隔符:通過
useDelimiter()
方法指定分隔符 - 正則表達(dá)式匹配:支持使用正則表達(dá)式匹配特定模式
二、基本用法:從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)
1. 讀取控制臺輸入的字符串和數(shù)字
import java.util.Scanner; public class ScannerExample { public static void main(String[] args) { // 創(chuàng)建Scanner對象,關(guān)聯(lián)標(biāo)準(zhǔn)輸入流 Scanner scanner = new Scanner(System.in); System.out.print("請輸入您的姓名: "); String name = scanner.nextLine(); // 讀取整行文本 System.out.print("請輸入您的年齡: "); int age = scanner.nextInt(); // 讀取整數(shù) System.out.print("請輸入您的身高(m): "); double height = scanner.nextDouble(); // 讀取浮點數(shù) System.out.printf("姓名: %s, 年齡: %d, 身高: %.2f\n", name, age, height); // 關(guān)閉Scanner(重要!避免資源泄漏) scanner.close(); } }
2. 關(guān)鍵方法說明
nextLine()
:讀取一整行文本(包括換行符),返回字符串next()
:讀取下一個標(biāo)記(以分隔符為界),返回字符串nextInt()
、**nextDouble()
** 等:讀取對應(yīng)類型的數(shù)據(jù),指針移至下一個標(biāo)記hasNext()
、**hasNextInt()
** 等:判斷是否還有下一個標(biāo)記或特定類型的數(shù)據(jù)
三、處理不同輸入源
1. 從文件讀取數(shù)據(jù)
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FileReadingExample { public static void main(String[] args) { try { // 創(chuàng)建File對象指向待讀取的文件 File file = new File("data.txt"); // 創(chuàng)建Scanner對象關(guān)聯(lián)文件輸入流 Scanner scanner = new Scanner(file); // 逐行讀取文件內(nèi)容 while (scanner.hasNextLine()) { String line = scanner.nextLine(); System.out.println(line); } scanner.close(); // 關(guān)閉Scanner } catch (FileNotFoundException e) { e.printStackTrace(); } } }
2. 從字符串讀取數(shù)據(jù)
import java.util.Scanner; public class StringParsingExample { public static void main(String[] args) { String input = "姓名:張三 年齡:25 身高:1.75"; // 創(chuàng)建Scanner對象關(guān)聯(lián)字符串 Scanner scanner = new Scanner(input); // 設(shè)置分隔符為空格或冒號 scanner.useDelimiter("[ :]"); while (scanner.hasNext()) { String token = scanner.next(); System.out.println(token); } scanner.close(); } }
四、高級用法:自定義分隔符與正則匹配
1. 使用正則表達(dá)式作為分隔符
import java.util.Scanner; public class DelimiterExample { public static void main(String[] args) { String data = "Hello,World|Java-Programming"; // 使用正則表達(dá)式設(shè)置多個分隔符 Scanner scanner = new Scanner(data); scanner.useDelimiter("[,|\\-]"); // 逗號、豎線或連字符 while (scanner.hasNext()) { System.out.println(scanner.next()); } scanner.close(); } }
2. 正則表達(dá)式匹配特定模式
import java.util.Scanner; public class RegexMatchingExample { public static void main(String[] args) { String input = "ID:1001 Name:Alice Age:25"; Scanner scanner = new Scanner(input); // 匹配數(shù)字模式 while (scanner.hasNext()) { if (scanner.hasNextInt()) { System.out.println("數(shù)字: " + scanner.nextInt()); } else { System.out.println("文本: " + scanner.next()); } } scanner.close(); } }
五、常見問題與解決方案
1. next () 與 nextLine () 混用導(dǎo)致的問題
Scanner scanner = new Scanner(System.in); System.out.print("請輸入一個數(shù)字: "); int num = scanner.nextInt(); // 讀取數(shù)字,但不讀取換行符 System.out.print("請輸入一行文本: "); String line = scanner.nextLine(); // 讀取殘留的換行符,導(dǎo)致直接跳過輸入 System.out.println("數(shù)字: " + num); System.out.println("文本: " + line); scanner.close();
解決方案:在nextInt()
等方法后手動消耗換行符:
int num = scanner.nextInt(); scanner.nextLine(); // 消耗殘留的換行符 String line = scanner.nextLine(); // 正常讀取下一行
2. 資源泄漏問題
若不關(guān)閉Scanner
,會導(dǎo)致底層輸入流未釋放,造成資源泄漏。建議使用try-with-resources
語句自動關(guān)閉:
try (Scanner scanner = new Scanner(System.in)) { // 使用scanner讀取數(shù)據(jù) String input = scanner.nextLine(); System.out.println("輸入: " + input); } // 自動關(guān)閉scanner
六、Scanner 類與其他輸入方式的對比
方式 | 適用場景 | 特點 |
---|---|---|
Scanner | 復(fù)雜格式輸入解析 | 靈活的分隔符設(shè)置、支持正則匹配、自動類型轉(zhuǎn)換 |
BufferedReader | 高效讀取大量文本 | 基于字符緩沖,性能更高,但僅支持字符串讀取 |
Console | 安全讀取密碼等敏感信息 | 直接與系統(tǒng)控制臺交互,輸入密碼時不顯示明文 |
System.in | 底層字節(jié)流操作 | 最基本的輸入流,需手動處理編碼和轉(zhuǎn)換 |
七、最佳實踐
- 及時關(guān)閉資源:使用
try-with-resources
確保Scanner
自動關(guān)閉 - 注意輸入緩沖:混用
next()
系列方法與nextLine()
時,手動處理換行符 - 合理選擇分隔符:通過
useDelimiter()
優(yōu)化復(fù)雜格式的解析 - 驗證輸入類型:使用
hasNextInt()
等方法驗證輸入類型,避免異常 - 避免重復(fù)創(chuàng)建對象:在同一輸入源的多次讀取中復(fù)用
Scanner
實例
通過掌握Scanner
類的核心功能與最佳實踐,開發(fā)者可以高效處理各種輸入場景,提升代碼的健壯性與靈活性
到此這篇關(guān)于Java Scanner 類詳解的文章就介紹到這了,更多相關(guān)Java Scanner 類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決java.lang.IllegalArgumentException: URI is
這篇文章主要介紹了解決java.lang.IllegalArgumentException: URI is not hierarchical報錯的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06Mybatis在sqlite中無法讀寫byte[]類問題的解決辦法
這篇文章主要給大家介紹了關(guān)于Mybatis在sqlite中無法讀寫byte[]類問題的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10HttpClient的RedirectStrategy重定向處理核心機(jī)制
這篇文章主要為大家介紹了HttpClient的RedirectStrategy重定向處理核心機(jī)制源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Spring定時任務(wù)關(guān)于@EnableScheduling的用法解析
這篇文章主要介紹了Spring定時任務(wù)關(guān)于@EnableScheduling的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06淺談Java代理(jdk靜態(tài)代理、動態(tài)代理和cglib動態(tài)代理)
下面小編就為大家?guī)硪黄獪\談Java代理(jdk靜態(tài)代理、動態(tài)代理和cglib動態(tài)代理)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01Spring AOP實現(xiàn)復(fù)雜的日志記錄操作(自定義注解)
Spring AOP實現(xiàn)復(fù)雜的日志記錄操作(自定義注解),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09