Java的Scanner類(Java基礎複習歸納系列)
參考資料:Java doc、THU 諶衛軍老師的教學PPT
Scanner類
作用:一個可以使用正則表示式來解析基本型別和字串的簡單文字掃描器。可以方便地對文字檔案中的每一個不同型別的資料單元進行訪問;
Scanner 使用分隔符模式將其輸入分解為一個個標記(token),預設情況下該分隔符模式與空格(whitespace)匹配。然後可以使用不同的 next 方法將得到的標記轉換為不同型別的值。
構造方法
Scanner(File source) |
Scanner(InputStream source) |
Scanner(String source) 構造一個新的Scanner,它生成的值是從指定字串掃描的。 |
常用方法
boolean |
hasNext() |
此掃描器不執行任何輸入 |
|
boolean |
hasNextLine() |
||
boolean |
nextBoolean() |
||
byte |
nextByte() |
若檔案已結束,則丟擲NoSuchElementException; 若型別不一致,則丟擲InputMismatchException |
|
double |
nextDouble() |
||
int |
nextInt() |
||
String |
nextLine() |
||
|
close() |
讀取下一個資料單元的前提是該單元存在,所以在讀取資料單元之前,需要先判斷其是否存在:
boolean hasNext();
boolean hasNextInt();
boolean hasNextDouble();
boolean hasNextBoolean();
boolean hasNextLine();
例1:訪問weather.txt檔案,計算所有氣溫的平均值
import java.io.*; // for File
import java.util.*; // for Scanner
public class TestScanner1 {
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("D:\\weather.txt"));
int num = 0;
double sum = 0;
System.out.print("讀入的氣溫值:");
while (input.hasNext()) {
if (input.hasNextDouble()) {
Double temp = input.nextDouble();
sum += temp;
System.out.print(temp + "\t");
num++;
} else
input.next();
}
input.close();
System.out.println("\nAverage: " + sum / num);
}
}
執行結果:
例2:訪問檔案hours.txt計算每個人的工作時間
按照以下格式輸出:
此題中,一行代表一個人的資料,要求每個人的工作時間需要逐行讀取,並對每一行的資料按固定的“ID+姓名+時間”的格式進行分解。
import java.io.*; // for File
import java.util.*; // for Scanner
public class TestScanner2 {
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("D:\\hours.txt"));
while (input.hasNextLine()) {
String line = input.nextLine();
processEmployee(line);
}
}
public static void processEmployee(String line) {
Scanner lineScan = new Scanner(line);
int id = lineScan.nextInt(); // e.g. 456
String name = lineScan.next(); // e.g. "Greg"
double sum = 0.0;
int count = 0;
while (lineScan.hasNextDouble()) {
sum = sum + lineScan.nextDouble();
count++;
}
double average = sum / count;
System.out.println(name + " (ID#" + id + ") worked " +
sum + " hours (" + average + " hours/day)");
}
}