Java中的 Scanner簡述(企業筆試線上程式設計的輸入控制)
摘要:
最近進行企業線上筆試時,發現企業的筆試平臺大都使用賽碼網(雖然槽點很多),而且線上程式設計都需要使用Scanner來讀取程式的輸入,因此,筆者就在先輩們的成果上對Scanner做了一份全新的、詳細的總結。我們知道,java.util.Scanner是Java5的新特徵,主要功能是簡化文字掃描。這個類最實用的地方表現在獲取控制檯輸入,其他的功能都很雞肋,儘管Java API文件中列舉了大量的API方法,但是都不怎麼地,特此簡述。
一. 掃描控制檯輸入
這個例子是常常會用到,但是如果沒有Scanner,你寫寫就知道多難受了。在這個例子中,通過new Scanner(System.in)建立一個Scanner,控制檯會一直等待輸入,直到敲回車鍵結束,把所輸入的內容傳給Scanner,作為掃描物件。如果要獲取輸入的內容,則只需要呼叫Scanner的nextLine()方法即可。
/**
* 掃描控制檯輸入
*
*/
public class TestScanner {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("請輸入字串:");
while (true) {
String line = s.nextLine();
if (line.equals("exit")) break;
System.out.println(">>>" + line);
}
}
}/* Output():
請輸入字串:
234
>>>234
wer
>>>wer
bye
>>>bye
*///
二. Scanner的便捷性
如果說Scanner使用簡便,不如說Scanner的構造器支援多種方式,構建Scanner的物件很方便。
三. Scanner分隔符
Scanner 預設使用空格作為分隔符來分隔文字,但允許我們通過使用方法useDelimiter(String pattern)指定新的分隔符。特別需要注意的是,方法useDelimiter(String pattern)的引數是一個正則表示式字串,若想指定多個分隔符來分割,須使用”|”將它們隔開。如下所示:
public static void test7() {
Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las");
s.useDelimiter(" |,|\\."); // 將使用空格,逗號和點號來分割Scanner輸入
while (s.hasNext()) {
System.out.println(s.next());
}
}/* Output():
123
asdf
sd
45
789
sdf
asdfl
sdf
sdfl
asdf
asdfkl
las
*///
四、Scanner常用API剖析和使用例項
現列舉Java中關於Scanner比較常用的幾個API:
delimiter()
返回此 Scanner 當前正在用於匹配分隔符的 Pattern。hasNext()
判斷掃描器中當前掃描位置後是否還存在下一段,預設以一個或多個連續的空格作為段的分隔符。hasNextLine()
如果在此掃描器的輸入中存在另一行(以回車作為”分行符”),則返回 true。next()
查詢並返回來自此掃描器的下一個完整標記(取得輸入段)。nextLine()
此掃描器執行當前行,並返回跳過的輸入資訊(取得輸入行文字)。
Scanner使用例項 (主要針對筆試程式設計中的多行輸入和單行輸入):
1). hasNextLine() 和 nextLine() 的用法
public class TestScanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 正則表示式字串
//scanner.useDelimiter("\\*");
System.out.println("請輸入字串:");
// test1(scanner);
test2(scanner);
// test3(scanner);
}
/**
* @description 以行(回車)讀取,每在控制檯輸入三行則列印一次;不夠三行,則阻塞等待
* @author rico
* @created 2017年4月5日 上午10:31:14
* @param scanner
*/
public static void test1(Scanner scanner) {
while (true) { // scanner 不斷從控制檯讀取,若無內容,則阻塞等待
// 以行讀取
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
String s3 = scanner.nextLine();
System.out.println(">>>" + s1);
System.out.println(">>>" + s2);
System.out.println(">>>" + s3);
}
}
/**
* @description 以行(回車)讀取,每在控制檯輸入三行則列印一次;不夠三行,則阻塞等待(與方法test1等效)
* @author rico
* @created 2017年4月5日 上午10:31:14
* @param scanner
*/
public static void test2(Scanner scanner) {
while (scanner.hasNextLine()) { // 一旦控制檯有輸入,scanner就開始從控制檯讀取
// 以行讀取
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
String s3 = scanner.nextLine();
System.out.println(">>>" + s1);
System.out.println(">>>" + s2);
System.out.println(">>>" + s3);
}
}
/**
* @description 以行讀取,每敲一次回車鍵讀取一次,不會忽略空格
* @author rico
* @created 2017年4月5日 上午10:31:14
* @param scanner
*/
public static void test3(Scanner scanner) {
while (scanner.hasNextLine()) { // 一旦控制檯有輸入,scanner就開始從控制檯讀取
String s1 = scanner.nextLine();
System.out.println(">>>" + s1);
System.out.println(">>>" + s1.length());
}
}
2). hasNext() 和 next() 的用法
public class TestScanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 正則表示式字串
//scanner.useDelimiter("\\*");
System.out.println("請輸入字串:");
// test4(scanner);
test5(scanner);
//test6(scanner);
}
/**
* @description 預設以一個或多個空格作為分割符來分隔行文字,每三個作為一組輸出一次(不夠三個則阻塞等待,直到夠三個才作為一組進行輸出);此外,連續輸入三行(每行一個)也可以。
* @author rico
* @created 2017年4月5日 上午10:37:54
* @param scanner
*/
public static void test4(Scanner scanner) {
while (true) { // scanner 不斷從控制檯讀取,若無內容,則阻塞等待
String s1 = scanner.next();
String s2 = scanner.next();
String s3 = scanner.next();
System.out.println(">>>" + s1);
System.out.println(">>>" + s2);
System.out.println(">>>" + s3);
}
}
/**
* @description 以一個或多個空格作為分割符來分隔行文字,每三個作為一組輸出一次(不夠三個則阻塞等待,直到夠三個才作為一組進行輸出);此外,連續輸入三行(每行一個)也可以。
* @author rico
* @created 2017年4月5日 上午10:49:22
* @param scanner
*/
public static void test5(Scanner scanner) {
while (scanner.hasNext()) { // 一旦控制檯有輸入,scanner就開始從控制檯讀取
String s1 = scanner.next();
String s2 = scanner.next();
String s3 = scanner.next();
System.out.println(">>>" + s1);
System.out.println(">>>" + s2);
System.out.println(">>>" + s3);
}
}
/**
* @description 以一個或多個空格作為分割符來分隔行文字,以一個作為一組進行輸出(所有的空格均為分割符),有幾個就輸出幾個
* @author rico
* @created 2017年4月5日 上午10:37:54
* @param scanner
*/
public static void test6(Scanner scanner) {
System.out.println(scanner.delimiter());
while (true) { // scanner 不斷從控制檯讀取,若無內容,則阻塞等待
String s1 = scanner.next();
System.out.println(">>>" + s1);
System.out.println(">>>" + s1.length());
}
}
3). nextLine() 與 next() 的區別
nextLine():以回車作為換行標誌;
next() :以一個或多個空格作為分段標誌,也可以以回車作為分段標誌(如上圖所示)。
五. Scanner 掃描檔案輸入
看下面例子完成了使用Scanner 掃描檔案輸入:
public static void main(String[] args) throws FileNotFoundException {
InputStream in = new FileInputStream(new File("C:\\AutoSubmit.java")); // 建立檔案輸入流
Scanner s = new Scanner(in);
while(s.hasNextLine()){
System.out.println(s.nextLine());
}
}/* Output():
package own;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import com.verisign.uuid.UUID;
/**
* @author wangpeng
*
*/
...
*///