Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Потоки ввода-вывода
Подраздел: Сканирование и Форматирование
Сканирование
Домашняя страница > Существенные Классы > Основной ввод-вывод

Сканирование

Объекты типа Scanner полезны для того, чтобы сломали отформатированный ввод в маркеры и преобразовали отдельные маркеры согласно их типу данных.

Повреждение Ввода в Маркеры

По умолчанию сканер использует пробел, чтобы разделить маркеры. (Пробельные символы включают пробелы, вкладки, и разделители строки. Для полного списка сошлитесь на документацию для Character.isWhitespace.), Чтобы видеть, как сканирование работает, давайте смотреть на ScanXan, программа, которая читает отдельные слова в xanadu.txt и распечатывает их, один на строку.

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 вызывает Scanner's close метод, когда это делается с объектом сканера. Даже при том, что сканер не является потоком, Вы должны закрыть его, чтобы указать, что Вы делаетесь с его базовым потоком.

Вывод ScanXan похож на это:

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

Чтобы использовать различный маркерный разделитель, вызвать useDelimiter(), определение регулярного выражения. Например, предположите, что Вы хотели, чтобы маркерный разделитель был запятой, дополнительно сопровождаемой пробелом. Вы вызвали бы,

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

Преобразование Отдельных Маркеров

ScanXan пример обрабатывает все входные маркеры как простые String значения. Scanner также поддерживает маркеры для всех типов примитивов языка Java (за исключением char), так же как BigInteger и BigDecimal. Кроме того, числовые значения могут использовать тысячи разделителей. Таким образом, в a US локаль, Scanner правильно читает строку "32 767" как представление целочисленного значения.

Мы должны упомянуть локаль, потому что тысячи разделителей и десятичных разделителей являются определенной локалью. Так, следующий пример не работал бы правильно во всех локалях, если бы мы не определяли, что сканер должен использовать US локаль. Это не что-то, о чем обычно необходимо волноваться, потому что Ваши входные данные обычно прибывают из источников, которые используют ту же самую локаль, как Вы делаете. Но этот пример является частью Учебного руководства по Java и распределяется во всем мире.

ScanSum пример читает список double значения и складывают их. Вот источник:

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.txt

8.5
32,767
3.14159
1,000,000.1

Выходная строка "1032778.74159". Период будет различным символом в некоторых локалях, потому что System.out a PrintStream объект, и что class не обеспечивает способ переопределить локаль значения по умолчанию. Мы могли переопределить локаль для целой программы — или мы могли только использовать форматирование, как описано в следующей теме, Форматировании.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Сканирование и Форматирование
Следующая страница: Форматирование