1. 程式人生 > >Java的Scanner類(Java基礎複習歸納系列)

Java的Scanner類(Java基礎複習歸納系列)

   參考資料:Java doc、THU 諶衛軍老師的教學PPT

Scanner類

        作用:一個可以使用正則表示式來解析基本型別和字串的簡單文字掃描器可以方便地對文字檔案中的每一個不同型別的資料單元進行訪問;

        Scanner 使用分隔符模式將其輸入分解為一個個標記(token),預設情況下該分隔符模式與空格(whitespace)匹配。然後可以使用不同的 next 方法將得到的標記轉換為不同型別的值。

        構造方法

Scanner(File source) 
構造一個新的 Scanner,它生成的值是從指定檔案掃描的。

Scanner(InputStream source) 
構造一個新的 Scanner,它生成的值是從指定的輸入流掃描的。

Scanner(String source)

構造一個新的Scanner,它生成的值是從指定字串掃描的。

        常用方法

boolean

hasNext() 
    如果此掃描器的輸入中有另一個標記,則返回 true。

此掃描器不執行任何輸入

boolean

hasNextLine() 
    如果在此掃描器的輸入中存在另一行,則返回 true。

boolean

nextBoolean() 
      掃描解釋為一個布林值的輸入標記並返回該值。

 byte

nextByte() 
    將輸入資訊的下一個標記掃描為一個 byte。

若檔案已結束,則丟擲NoSuchElementException;

若型別不一致,則丟擲InputMismatchException

   

 double

nextDouble()

 
    將輸入資訊的下一個標記掃描為一個 double。

 int

nextInt() 
    將輸入資訊的下一個標記掃描為一個 int。

 String

nextLine() 
    此掃描器執行當前行,並返回跳過的輸入資訊。

void

close() 
    關閉此掃描器。在掃描器關閉後執行搜尋操作將導致 IllegalStateException

        讀取下一個資料單元的前提是該單元存在,所以在讀取資料單元之前,需要先判斷其是否存在:

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)");
    }
}