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 не обеспечивает способ переопределить локаль значения по умолчанию. Мы могли переопределить локаль для целой программы — или мы могли только использовать форматирование, как описано в следующей теме, Форматировании.