|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Объекты типа Scanner полезны для того, чтобы сломали отформатированный ввод в маркеры и преобразовали отдельные маркеры согласно их типу данных.
По умолчанию сканер использует пробел, чтобы разделить маркеры. (Пробельные символы включают пробелы, вкладки, и разделители строки. Для полного списка сошлитесь на документацию для .), Чтобы видеть, как сканирование работает, давайте смотреть на
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 не обеспечивает способ переопределить локаль значения по умолчанию. Мы могли переопределить локаль для целой программы — или мы могли только использовать форматирование, как описано в следующей теме, Форматировании.