Поиск…


Синтаксис

  • Сканер сканера = новый сканер (источник источника);
  • Сканер сканера = новый сканер (System.in);

параметры

параметр подробности
Источник Источник может быть либо одним из String, File или любого типа InputStream

замечания

Класс Scanner был введен в Java 5. Метод reset() был добавлен в Java 6, а в Java 7 было добавлено несколько новых конструкторов для взаимодействия с (тогда) новым интерфейсом Path .

Чтение системного входа с помощью сканера

Scanner scanner = new Scanner(System.in); //Scanner obj to read System input
String inputTaken = new String();
while (true) {
    String input = scanner.nextLine(); // reading one line of input
    if (input.matches("\\s+"))         // if it matches spaces/tabs, stop reading
        break;
    inputTaken += input + " ";
}
System.out.println(inputTaken);

Объект сканера инициализируется для чтения ввода с клавиатуры. Таким образом, для нижнего входа от брелка он будет выводить вывод как Reading from keyboard

Reading
from
keyboard
  //space

Чтение ввода файла с помощью сканера

Scanner scanner = null;
try {
    scanner = new Scanner(new File("Names.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (Exception e) {
    System.err.println("Exception occurred!");
} finally {
    if (scanner != null)
        scanner.close();
}

Здесь объект Scanner создается путем передачи объекта File содержащего имя текстового файла в качестве входного. Этот текстовый файл будет открыт объектом File и будет считываться с помощью объекта сканера в следующих строках. scanner.hasNext() проверит, есть ли следующая строка данных в текстовом файле. Объединение , что с в while цикла позволит перебирать все строки данных в Names.txt файл. Для извлечения самих данных мы можем использовать такие методы, как nextLine() , nextInt() , nextBoolean() и т. Д. В приведенном выше примере используется scanner.nextLine() . nextLine() относится к следующей строке в текстовом файле, и объединение ее со scanner объектом позволяет распечатать содержимое строки. Чтобы закрыть объект сканера, вы должны использовать .close() .

Используя попытку с ресурсами (начиная с Java 7), вышеупомянутый код можно написать элегантно, как показано ниже.

try (Scanner scanner = new Scanner(new File("Names.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (Exception e) {
    System.err.println("Exception occurred!");
}

Прочитайте весь ввод в виде строки с помощью сканера

Вы можете использовать Scanner для чтения всего текста на входе в виде строки, используя \Z (весь ввод) в качестве разделителя. Например, это можно использовать для чтения всего текста в текстовом файле в одной строке:

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);

Помните, что вам придется закрыть сканер, а также поймать IoException это может вызвать, как описано в примере Чтение файла с помощью Scanner .

Использование пользовательских разделителей

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

Scanner scanner = null;
try{
    scanner = new Scanner("i,like,unicorns").useDelimiter(",");;
    while(scanner.hasNext()){
        System.out.println(scanner.next());
    }
}catch(Exception e){
    e.printStackTrace();
}finally{
    if (scanner != null)
        scanner.close();
}

Это позволит вам читать каждый элемент на входе индивидуально. Обратите внимание, что вы не должны использовать это для анализа данных CSV, вместо этого используйте правильную библиотеку парсеров CSV, см. Парсер CSV для Java для других возможностей.

Общая схема, которая чаще всего задается в задачах

Ниже приведен пример того, как правильно использовать класс java.util.Scanner для интерактивного чтения пользовательского ввода из System.in (иногда называемого stdin , особенно на языках C, C ++ и других языках, а также в Unix и Linux). Он идиоматически демонстрирует наиболее распространенные вещи, которые требуются.

package com.stackoverflow.scanner;

import javax.annotation.Nonnull;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.regex.Pattern;

import static java.lang.String.format;

public class ScannerExample
{
    private static final Set<String> EXIT_COMMANDS;
    private static final Set<String> HELP_COMMANDS;
    private static final Pattern DATE_PATTERN;
    private static final String HELP_MESSAGE;

    static
    {
        final SortedSet<String> ecmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
        ecmds.addAll(Arrays.asList("exit", "done", "quit", "end", "fino"));
        EXIT_COMMANDS = Collections.unmodifiableSortedSet(ecmds);
        final SortedSet<String> hcmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
        hcmds.addAll(Arrays.asList("help", "helpi", "?"));
        HELP_COMMANDS = Collections.unmodifiableSet(hcmds);
        DATE_PATTERN = Pattern.compile("\\d{4}([-\\/])\\d{2}\\1\\d{2}"); // http://regex101.com/r/xB8dR3/1
        HELP_MESSAGE = format("Please enter some data or enter one of the following commands to exit %s", EXIT_COMMANDS);
    }

    /**
     * Using exceptions to control execution flow is always bad.
     * That is why this is encapsulated in a method, this is done this
     * way specifically so as not to introduce any external libraries
     * so that this is a completely self contained example.
     * @param s possible url
     * @return true if s represents a valid url, false otherwise
     */
    private static boolean isValidURL(@Nonnull final String s)
    {
        try { new URL(s); return true; }
        catch (final MalformedURLException e) { return false; }
    }

    private static void output(@Nonnull final String format, @Nonnull final Object... args)
    {
        System.out.println(format(format, args));
    }

    public static void main(final String[] args)
    {
        final Scanner sis = new Scanner(System.in);
        output(HELP_MESSAGE);
        while (sis.hasNext())
        {
            if (sis.hasNextInt())
            {
                final int next = sis.nextInt();
                output("You entered an Integer = %d", next);
            }
            else if (sis.hasNextLong())
            {
                final long next = sis.nextLong();
                output("You entered a Long = %d", next);
            }
            else if (sis.hasNextDouble())
            {
                final double next = sis.nextDouble();
                output("You entered a Double = %f", next);
            }
            else if (sis.hasNext("\\d+"))
            {
                final BigInteger next = sis.nextBigInteger();
                output("You entered a BigInteger = %s", next);
            }
            else if (sis.hasNextBoolean())
            {
                final boolean next = sis.nextBoolean();
                output("You entered a Boolean representation = %s", next);
            }
            else if (sis.hasNext(DATE_PATTERN))
            {
                final String next = sis.next(DATE_PATTERN);
                output("You entered a Date representation = %s", next);
            }
            else // unclassified
            {
                final String next = sis.next();
                if (isValidURL(next))
                {
                    output("You entered a valid URL = %s", next);
                }
                else
                {
                    if (EXIT_COMMANDS.contains(next))
                    {
                        output("Exit command %s issued, exiting!", next);
                        break;
                    }
                    else if (HELP_COMMANDS.contains(next)) { output(HELP_MESSAGE); }
                    else { output("You entered an unclassified String = %s", next); }
                }
            }
        }
        /*
           This will close the underlying Readable, in this case System.in, and free those resources.
           You will not be to read from System.in anymore after this you call .close().
           If you wanted to use System.in for something else, then don't close the Scanner.
        */
        sis.close();
        System.exit(0);
    }
}

Чтение int из командной строки

import java.util.Scanner;

Scanner s = new Scanner(System.in);
int number = s.nextInt();

Если вы хотите прочитать int из командной строки, просто используйте этот фрагмент. Прежде всего, вам нужно создать объект Scanner, который будет прослушивать System.in, который по умолчанию является командной строкой, когда вы запускаете программу из командной строки. После этого с помощью объекта Scanner вы читаете первый int, который пользователь переходит в командную строку и сохраняет его в номере переменной. Теперь вы можете делать все, что захотите, с сохраненным int.

Аккуратно закрыть сканер

может случиться, что вы используете сканер с параметром System.in как для конструктора, тогда вам нужно знать, что закрытие сканера закроет InputStream, давая в следующем, чтобы каждый попытался прочитать ввод на этом (или любой другой объект сканера) будет вызывать java.util.NoSuchElementException или java.lang.IllegalStateException

пример:

    Scanner sc1 = new Scanner(System.in);
    Scanner sc2 = new Scanner(System.in);
    int x1 = sc1.nextInt();
    sc1.close();
    // java.util.NoSuchElementException
    int x2 = sc2.nextInt();
    // java.lang.IllegalStateException
    x2 = sc1.nextInt();


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow