Автор оригинала: Eugen Paraschiv.
Сканер Java
1. Обзор сканера
В этом быстром учебнике мы иллюстр хотим проиллюстрировать, как использовать Java Сканер класс – читать входные данные, находить и пропускать шаблоны с различными делимитерами.
2. Сканирование файла
Во-первых – давайте посмотрим, как читать файл с помощью Сканер .
В следующем примере мы читаем файл, содержащий ” Привет мировой ” в токены:
@Test public void whenReadFileWithScanner_thenCorrect() throws IOException{ Scanner scanner = new Scanner(new File("test.txt")); assertTrue(scanner.hasNext()); assertEquals("Hello", scanner.next()); assertEquals("world", scanner.next()); scanner.close(); }
Обратите внимание, что Далее () метод возвращает следующий Струнные маркер здесь.
Кроме того, обратите внимание, как мы закрываем сканер, когда мы закончили использовать его.
3. Преобразование inputStream в строку
Далее – давайте посмотрим, как преобразовать ВходНая трансляция в Струнные с помощью Сканер :
@Test public void whenConvertInputStreamToString_thenConverted() throws IOException { String expectedValue = "Hello world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.useDelimiter("A"); String result = scanner.next(); assertEquals(expectedValue, result); scanner.close(); }
Как и в предыдущем примере, мы использовали Сканер токенизировать весь поток от начала до следующего regex “A” – который соответствует полному входу.
4. Сканер против BufferedReader
Теперь – давайте обсудим разницу между Сканер и BufferedЧитатель – мы обычно используем:
- BufferedЧитатель когда мы хотим прочитать входную в строки
- Сканер читать входные в токены
В следующем примере мы читаем файл в строки, используя BufferedЧитатель :
@Test public void whenReadUsingBufferedReader_thenCorrect() throws IOException { String firstLine = "Hello world"; String secondLine = "Hi, John"; BufferedReader reader = new BufferedReader(new FileReader("test.txt")); String result = reader.readLine(); assertEquals(firstLine, result); result = reader.readLine(); assertEquals(secondLine, result); reader.close(); }
Теперь, давайте использовать Сканер читать один и тот же файл в токены:
@Test public void whenReadUsingScanner_thenCorrect() throws IOException { String firstLine = "Hello world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.nextLine(); assertEquals(firstLine, result); scanner.useDelimiter(", "); assertEquals("Hi", scanner.next()); assertEquals("John", scanner.next()); scanner.close(); }
Обратите внимание, как мы используем Сканер nextLine () API — читать всю строку .
5. Сканирование входных данных с консоли с помощью нового сканера (System.in)
Далее – Давайте посмотрим, как читать входные данные с консоли с помощью Сканер пример:
@Test public void whenReadingInputFromConsole_thenCorrect() { String input = "Hello"; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(input.getBytes())); Scanner scanner = new Scanner(System.in); String result = scanner.next(); assertEquals(input, result); System.setIn(stdin); scanner.close(); }
Обратите внимание, что мы использовали System.setIn(…) для имитации некоторых входных данных, поступающих от консоли.
5.1. NextLine () API
Этот метод просто возвращает строку в текущей строке:
scanner.nextLine();
Это считывает содержимое текущей строки и возвращает ее, за исключением любого сепаратора строки в конце – в данном случае – нового символа строки.
После прочтения содержания, Сканер устанавливает свою позицию к началу следующей строки. Важно помнить, что nextLine () API потребляет сепаратор строки и перемещает положение Сканер к следующей строке .
Так что в следующий раз, если мы прочтем Сканер Мы будем читать с самого начала следующей строки.
5.2. nextInt () API
Этот метод сканирует следующий маркер ввода в качестве int:
scanner.nextInt();
API читает токен integer, доступный далее.
В этом случае, если следующий токен является интегратором и после интегратора, есть линейный сепаратор, всегда помните, что nextInt () не будет потреблять линейный сепаратор. Вместо этого положение сканера будет сам сепаратор линии .
Так что, если у нас есть ряд операций, где первая операция является scanner.nextInt() а потом scanner.nextLine () и в качестве входного сигнала, если мы обеспечим перерыв в работе с integer и пресс-линией, обе операции будут выполнены.
nextInt () API будет потреблять integer и nextLine () API будет потреблять сепаратор строки и будет Сканер к началу следующей строки.
6. Проверка входных данных
Теперь – давайте посмотрим, как проверить вход с помощью Сканер . В следующем примере мы используем Сканер метод hasNextInt() чтобы проверить, является ли входное значение более интегративным:
@Test public void whenValidateInputUsingScanner_thenValidated() throws IOException { String input = "2000"; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(input.getBytes())); Scanner scanner = new Scanner(System.in); boolean isIntInput = scanner.hasNextInt(); assertTrue(isIntInput); System.setIn(stdin); scanner.close(); }
7. Сканирование строки
Далее – давайте посмотрим, как сканировать Струнные с помощью Сканер :
@Test public void whenScanString_thenCorrect() throws IOException { String input = "Hello 1 F 3.5"; Scanner scanner = new Scanner(input); assertEquals("Hello", scanner.next()); assertEquals(1, scanner.nextInt()); assertEquals(15, scanner.nextInt(16)); assertEquals(3.5, scanner.nextDouble(), 0.00000001); scanner.close(); }
Примечание: Метод nextInt (16) читает следующий токен как шестисемейное значение интегратора.
8. Найти шаблон
Теперь – давайте посмотрим, как найти Шаблон с помощью Сканер .
В следующем примере мы используем findInLine() поиск токена, который соответствует данному Шаблон во всем входе:
@Test public void whenFindPatternUsingScanner_thenFound() throws IOException { String expectedValue = "world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.findInLine("wo..d"); assertEquals(expectedValue, result); scanner.close(); }
Мы также можем искать Шаблон в конкретном домене с использованием findWithinHorizon () как в следующем примере:
@Test public void whenFindPatternInHorizon_thenFound() throws IOException { String expectedValue = "world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.findWithinHorizon("wo..d", 5); assertNull(result); result = scanner.findWithinHorizon("wo..d", 100); assertEquals(expectedValue, result); scanner.close(); }
Обратите внимание, что горизонт поиска – это просто количество символов, в рамках которого выполняется поиск.
9. Пропустить шаблон
Далее – давайте посмотрим, как пропустить Шаблон в Сканер . Мы можем пропустить токены, которые соответствуют определенному шаблону при чтении ввода с помощью Сканер .
В следующем примере – мы пропускаем « Привет ” токен с использованием Сканер метод пропустить () :
@Test public void whenSkipPatternUsingScanner_thenSkipped() throws IOException { FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.skip(".e.lo"); assertEquals("world", scanner.next()); scanner.close(); }
10. Изменение сканера Delimiter
Наконец – давайте посмотрим, как изменить Сканер разделитель. В следующем примере мы меняем значение Сканер делимитер для ” o “:
@Test public void whenChangeScannerDelimiter_thenChanged() throws IOException { String expectedValue = "Hello world"; String[] splited = expectedValue.split("o"); FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.useDelimiter("o"); assertEquals(splited[0], scanner.next()); assertEquals(splited[1], scanner.next()); assertEquals(splited[2], scanner.next()); scanner.close(); }
Мы также можем использовать несколько делимитаторов. В следующем примере мы используем как запятые ” , ” и тире” – ” как делимитаторы для сканирования файла содержит ” Джон, Адам-Том “:
@Test public void whenReadWithScannerTwoDelimiters_thenCorrect() throws IOException { Scanner scanner = new Scanner(new File("test.txt")); scanner.useDelimiter(",|-"); assertEquals("John", scanner.next()); assertEquals("Adam", scanner.next()); assertEquals("Tom", scanner.next()); scanner.close(); }
Примечание: по умолчанию Сканер делимитер является whitespace.
11. Заключение
В этом учебнике мы использовали несколько реальных примеров использования Java Сканер .
Мы научились читать входные данные из файлов, консолей или Струнные с помощью Сканер ; мы также узнали, как найти и пропустить шаблон, используя Сканер – а также как изменить Сканер разделитель.
Осуществление этих примеров можно найти более на GitHub .