Java™ 教程(掃描)

掃描

編程I/O一般涉及轉換人們喜歡使用的整齊格式的數據,爲了幫助你完成這些工做,Java平臺提供了兩個API,掃描器API將輸入分解爲與數據位相關聯的單個標記,格式化API將數據組裝成格式良好、可讀的形式。html

Scanner類型的對象對於將格式化輸入分解爲標記並根據其數據類型轉換單個標記很是有用。java

將輸入分解爲標記

默認狀況下,掃描器使用空格分隔標記(空格字符包括空格、製表符和行終止符,有關完整列表,請參閱Character.isWhitespace的文檔),要了解掃描的工做原理,讓咱們看看ScanXan,這是一個讀取xanadu.txt中單個單詞並打印出來的程序,每行一個單詞。git

import java.io.*;
import java.util.Scanner;

public class ScanXan {
    public static void main(String[] args) throws IOException {

        Scanner s = null;

        try {
            s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

            while (s.hasNext()) {
                System.out.println(s.next());
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }
}

請注意,ScanXan在使用掃描器對象完成後會調用Scannerclose方法,即便掃描器不是流,你也須要將其關閉以指示你已完成其底層流。github

ScanXan的輸出以下所示:正則表達式

In
Xanadu
did
Kubla
Khan
A
stately
pleasure-dome
...

要使用其餘標記分隔符,請調用useDelimiter(),指定正則表達式,例如,假設你但願標記分隔符爲逗號,可選地後跟空格,你會調用:編程

s.useDelimiter(",\\s*");

轉換單個標記

ScanXan示例將全部輸入標記視爲簡單的String值,Scanner還支持全部Java語言的原始類型(char除外)的標記,以及BigIntegerBigDecimal,此外,數值可使用數千個分隔符。所以,在美國語言環境中,Scanner將字符串「32,767」正確地讀取爲一個整數值。segmentfault

咱們必須提到語言環境,由於千位分隔符和小數符號是特定於語言環境的,所以,若是咱們未指定掃描器應使用美國語言環境,則如下示例將沒法在全部語言環境中正常運行。這一般沒必要擔憂,由於你的輸入數據一般來自使用相同語言環境的源,可是這個例子是Java教程的一部分,而且分佈在世界各地。api

ScanSum示例讀取double值列表並將其相加,這是源碼:oracle

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;

public class ScanSum {
    public static void main(String[] args) throws IOException {

        Scanner s = null;
        double sum = 0;

        try {
            s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt")));
            s.useLocale(Locale.US);

            while (s.hasNext()) {
                if (s.hasNextDouble()) {
                    sum += s.nextDouble();
                } else {
                    s.next();
                }   
            }
        } finally {
            s.close();
        }

        System.out.println(sum);
    }
}

這是示例輸入文件usnumbers.txtdom

8.5
32,767
3.14159
1,000,000.1

輸出字符串是「1032778.74159」,在某些語言環境中,句點將是不一樣的字符,由於System.outPrintStream對象,而且該類不提供重寫默認語言環境的方法,咱們能夠覆蓋整個程序的語言環境 — 或者咱們能夠只使用格式化,以下一個主題格式化中所述。


上一篇:緩衝流

下一篇:格式化流

相關文章
相關標籤/搜索