Рубрики
Без рубрики

Сканер Java

Быстрый и практичный набор примеров для использования основного класса сканеров на Java – для работы со строками, файлами и пользовательским вводом.

Автор оригинала: 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 .