一、引言
在 Java 程序中,讀取用戶輸入是一個重要的操作。Scanner 類是 Java 中讀取控制台輸入的標準類,但是它在處理輸入時有一些限制,比如只能按照空格或者回車分割輸入。為了克服這些限制,Java SE 8 引入了一個新的掃描器類 NewScanner,它可以更自由地處理用戶輸入。本文將介紹 Java 中的新掃描器 NewScanner 的使用方法和相應的例子。
二、NewScanner 類的概述
Java 中的新掃描器 NewScanner 是在 Java SE 8 中引入的。NewScanner 類提供了更靈活和方便的方法來讀取用戶輸入。它支持使用自定義分隔符、正則表達式、字符集等方式讀取輸入,這使得我們可以更好地處理用戶輸入。下面是 NewScanner 類的構造方法:
public NewScanner(InputStream source, String charsetName) public NewScanner(InputStream source) public NewScanner(Path source, Charset charset) throws IOException public NewScanner(Path source) throws IOException public NewScanner(Readable source) public NewScanner(ReadableByteChannel source) public NewScanner(SocketChannel source) throws IOException public NewScanner(java.io.File file, String charsetName) throws FileNotFoundException public NewScanner(java.io.File file) throws FileNotFoundException public NewScanner(String source)
其中最常用的是傳入字元串或 System.in :
NewScanner scanner = new NewScanner(System.in);
三、NewScanner 類的方法
1. next() 方法
next() 方法會讀取輸入中的下一個字元串,並且自動跳過分隔符,直到下一個字元串。下面是 next() 方法的示常式序:
import java.util.*; public class NewScannerDemo { public static void main(String[] args) { NewScanner scanner = new NewScanner(System.in); System.out.println("Enter your name: "); String name = scanner.next(); System.out.println("Your name is " + name); } }
當我們運行這個程序時,它會提示我們輸入名字。我們輸入 “Tom Jerry” 作為名字,程序只會輸出 “Your name is Tom”,而 “Jerry” 被忽略了,因為它使用空格作為分割符。
2. useDelimiter() 方法
useDelimiter() 方法用於設置分隔符,以便在讀取 input() 時使用。這個方法的默認分隔符是空格。下面是使用 useDelimiter() 方法的示常式序:
import java.util.*; public class NewScannerDemo { public static void main(String[] args) { NewScanner scanner = new NewScanner(System.in); scanner.useDelimiter(","); System.out.println("Enter your name and age: "); String name = scanner.next(); int age = scanner.nextInt(); System.out.println("Your name is " + name.trim() + " and age is " + age); } }
在這個程序中,我們使用 useDelimiter() 方法將逗號設置為分隔符,這意味著輸入中的字元串將在遇到逗號時被切分為不同的標記。這裡我們讀取了兩個標記:名字和年齡。如果我們輸入 “Tom, 20″,那麼程序會輸出 “Your name is Tom and age is 20″。
3. hasNext() 和 hasNextLine() 方法
hasNext() 和 hasNextLine() 方法都是用來檢測輸入中是否還有下一個標記。hasNext() 和 hasNextLine() 方法的主要區別是前者只檢查下一個標記是否存在,而後者則檢查整行是否輸入完畢。下面是使用這兩個方法的示常式序:
import java.util.*; public class NewScannerDemo { public static void main(String[] args) { NewScanner scanner = new NewScanner(System.in); System.out.println("Enter your name: "); boolean inputIsString = scanner.hasNext(); if (inputIsString) { String name = scanner.nextLine(); System.out.println("Your name is " + name); } System.out.println("Enter your age: "); boolean inputIsInt = scanner.hasNextInt(); if(inputIsInt) { int age = scanner.nextInt(); System.out.println("Your age is " + age); } } }
在這個程序中,我們使用了兩個方法:hasNext() 和 hasNextLine()。前者用於檢查是否有下一個標記,後者用於檢查是否有輸入行。如果輸入行中有多個標記,那麼第一個標記將被讀取並在第一次調用時返回 true。如果用戶輸入了一個字元串和一個整數 “Tom\n20″,那麼程序會輸出 “Your name is Tom” 和 “Your age is 20″。
4. reset() 方法
reset() 方法用於將 NewScanner 對象重置為原始狀態。這個方法可以用來重新掃描輸入,或者在重複使用 NewScanner 對象時進行處理。下面是使用 reset() 方法的示常式序:
import java.util.*; public class NewScannerDemo { public static void main(String[] args) { NewScanner scanner = new NewScanner(System.in); System.out.println("Enter your name and age: "); String name = scanner.next(); int age = scanner.nextInt(); System.out.println("Your name is " + name + " and age is " + age); // Reset the scanner scanner.reset(); scanner.useDelimiter(","); // Read two tokens System.out.println("Enter your name and age separated by a comma: "); String name2 = scanner.next(); int age2 = scanner.nextInt(); System.out.println("Your name is " + name2 + " and age is " + age2); } }
在這個程序中,我們首先讀取了輸入中的兩個標記(名字和年齡),然後通過 reset() 方法將 NewScanner 對象重置為原始狀態。接下來,我們使用 useDelimiter() 方法將逗號設置為分隔符並再次讀取兩個標記。這裡,如果我們輸入 “Tom Jerry, 20″,那麼程序會輸出 “Your name is Tom Jerry and age is 20” 和 “Your name is Tom Jerry and age is 20″。
5. skip() 方法
skip() 方法用於跳過輸入中一定數量的位元組,從而允許我們跳過一些不必要的輸入。下面是使用 skip() 方法的示常式序:
import java.util.*; public class NewScannerDemo { public static void main(String[] args) { NewScanner scanner = new NewScanner(System.in); while (true) { System.out.println("Enter your age: "); if (scanner.hasNextInt()) { int age = scanner.nextInt(); System.out.println("Your age is " + age); break; } else { System.out.println("Invalid input"); scanner.skip(".*\n"); } } } }
在這個程序中,我們使用了一個 while 循環以允許用戶多次輸入,直到輸入為整數。如果輸入不是整數,那麼程序將輸出 “Invalid input” 並使用 skip() 方法跳過整行輸入。這裡我們使用了一個正則表達式,即 .*,它匹配輸入行的任何內容。如果我們輸入了 “abc\n123″,那麼程序會輸出 “Invalid input” 和 “Your age is 123″。
6. findInLine() 方法
findInLine() 方法用於在當前行中查找指定的正則表達式。它類似於 nextLine() 方法,但是它只查找指定的正則表達式,並返回一個字元串。下面是使用 findInLine() 方法的示常式序:
import java.util.*; public class NewScannerDemo { public static void main(String[] args) { NewScanner scanner = new NewScanner(System.in); String pattern = "\\w+"; //匹配單詞 String input = "Hello, Java!"; scanner = new NewScanner(input); System.out.println(scanner.findInLine(pattern)); // 輸出 Hello } }
在這個程序中,我們使用了一個正則表達式,即 \\w+,它匹配輸入中的單詞。在這個例子中,我們將 input 設置為 “Hello, Java!”,然後使用 findInLine() 方法來查找單詞。如果我們運行這個程序,它會輸出 “Hello”。
四、小結
在本文中,我們介紹了 Java SE 8 中新掃描器 NewScanner 的使用方法和相應的例子。NewScanner 類提供了更靈活和方便的方法來讀取用戶輸入,它支持使用自定義分隔符、正則表達式、字符集等方式讀取輸入。我們介紹了 NewScanner 類的一些主要方法,包括 next() 方法、useDelimiter() 方法、hasNext() 和 hasNextLine() 方法、reset() 方法、skip() 方法和 findInLine() 方法。希望本文對你了解和使用 Java 中的新掃描器 NewScanner 有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291279.html