Scanner next() 和 nextLine() 方法有什麼區別?
一、概述
Scanner
類帶有一組方法,通過將輸入分解為多個標記來簡化解析輸入的過程。它通常用於從不同來源讀取輸入數據,例如控制台和文件。
在這個簡短的教程中,我們將重點介紹其next()
和nextLine()
方法之間的區別。
儘管這兩種方法乍一看可能非常相似,但它們卻大不相同。
next()
方法
通常, Scanner
使用分隔符模式將輸入分成標記,默認情況下,分隔符模式是任何空格。
話雖如此,顧名思義, next()
只從輸入中讀取下一個標記,直到遇到定界符。
2.1.使用默認分隔符
正如我們前面提到的, Scanner
類使用空格作為默認分隔符。
例如,如果我們輸入“Hello world”
作為輸入, next()
將只讀取值“Hello”
.
剩下的單詞“world”,
將在下次調用next()
方法時可用。
那麼,讓我們用一個測試用例來舉例說明next()
的用法:
@Test
void givenInput_whenUsingNextMethod_thenReturnToken() {
String input = "Hello world";
try (Scanner scanner = new Scanner(input)) {
assertEquals("Hello", scanner.next());
assertEquals("world", scanner.next());
}
}
在這裡, Scanner
使用空格字符來解析輸入。
因此,第一次調用next()
方法只讀取值“Hello”
。此外,第二次調用讀取值“world”
。
請注意,空白包括幾個字符,而不僅僅是空格,例如製表符(\t)、回車符(\n)和更多字符。
2.2.使用自定義分隔符
Scanner
類提供了一種通過useDelimiter()
方法覆蓋默認定界符的便捷方法。
那麼,讓我們看看next()
方法如何使用自定義分隔符。
例如,我們將使用“:”
字符作為分隔符:
@Test
void givenInput_whenUsingNextMethodWithCustomDelimiter_thenReturnToken() {
String input = "Hello :world";
try (Scanner scanner = new Scanner(input)) {
scanner.useDelimiter(":");
assertEquals("Hello ", scanner.next());
assertEquals("world", scanner.next());
}
}
如上所示, next()
讀取“Hello”
,這次是空格字符。原因是Scanner
使用“:”
將輸入分成標記而不是空格。
3. nextLine()
方法
另一方面, nextLine()
消耗整行輸入,包括空白字符,直到到達換行符“\n”
。
換句話說,我們可以使用此方法讀取包含默認分隔符(例如空格)的輸入。它在收到“\n”
或按下回車鍵後立即停止讀取。
那麼,讓我們在實踐中看看它:
@Test
void givenInput_whenUsingNextLineMethod_thenReturnEntireLine() {
String input = "Hello world\nWelcome to baeldung.com";
try (Scanner scanner = new Scanner(input)) {
assertEquals("Hello world", scanner.nextLine());
assertEquals("Welcome to baeldung.com", scanner.nextLine());
}
}
正如我們所見,第一個scanner.nextLine()
讀取了整個值“Hello world”
,第二個消耗了輸入的其餘部分。
與將光標放在同一行的next()
不同, nextLine()
在讀取輸入後將光標指向下一行。
此處需要注意的重要一點是,與next()
不同,定義自定義定界符不會更改nexLine()
行為。
讓我們使用測試用例來確認這一點:
@Test
void givenInput_whenUsingNextLineWithCustomDelimiter_thenIgnoreDelimiter() {
String input = "Hello:world\nWelcome:to baeldung.com";
try (Scanner scanner = new Scanner(input)) {
scanner.useDelimiter(":");
assertEquals("Hello:world", scanner.nextLine());
assertEquals("Welcome:to baeldung.com", scanner.nextLine());
}
}
不出所料, nextLine()
方法會忽略我們的自定義分隔符並繼續讀取輸入,直到找到“\n”
字符。
4. 差異
簡而言之,這些是比較next()
和nextLine()
方法時要記住的一些關鍵點:
-
nextLine()
返回整個文本直到返回行。next()
根據給定的分隔符(默認為空白)讀取標記化文本 -
nextLine()
在讀取輸入後將掃描儀位置放置在下一行。但是,next()
將光標保持在同一行
5.結論
在這篇文章中,我們詳細解釋了Scanner.next()
和Scanner.
nextLine()
方法。
與往常一樣,示例的完整源代碼可在 GitHub 上獲得。