Как создать сканер java

Обновлено: 18.05.2024

Это руководство по посвящено использованию класса Scanner в Java пакета java.util. Мы будем показывать базовое применение класса Scanner до самых расширенных функций этого класса, используя примеры.

Объявление:
public final class Scanner
extends Object
implements Iterator, Closeable

Создает новый сканер, который создает значения, отсканированные из указанного источника.

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

public Scanner(InputStream source)

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

Однако мы можем использовать подклассы InputStream, как показано ниже. Мы использовали FileInputStream, поскольку он является подклассом InputStream, при его включении проблем не возникнет.

public Scanner(File source) выдает исключение FileNotFoundException

Этот конструктор очень прост. Просто требует источник файла. Единственной целью этого конструктора является создание экземпляра объекта Scanner для сканирования через файл.

public Scanner(Path source) throws IOException

public Scanner(String source)

Создает новый сканер, который выдает значения, отсканированные из указанной строки.

Этот конструктор может быть самым простым на практике, поскольку для него требуется только строковый параметр, и он строго используется для сканирования ввода строки.

Scanner в Java для чтения файлов

Считать файл очень легко, используя класс Scanner. Нам просто нужно объявить это с помощью конструктора Scanner, например:

Хитрость в итерации по токену Scanner состоит в том, чтобы применять те методы, которые начинаются с hasNext, hasNextInt и т.д. Давайте сначала остановимся на чтении файла построчно.

В приведенном выше фрагменте кода мы использовали флаг scan.hasNextLine() как средство проверки наличия токена, который в этом примере доступен на входе сканера. Метод nextLine() возвращает текущий токен и переходит к следующему.

Комбинации hasNextLine() и nextLine() широко используются для получения всех токенов на входе сканера. После этого мы вызываем метод close(), чтобы закрыть объект и тем самым избежать утечки памяти.

Считать строку из консоли ввода, используя Scanner Class

Класс Scanner принимает также InputStream для одного из своих конструкторов. Таким образом, ввод можно сделать с помощью:

После помещения в наш объект сканера, у нас теперь есть доступ к читаемому и конвертируемому потоку, что означает, что мы можем манипулировать или разбивать входные данные на токены. Используя богатый набор API сканера, мы можем читать токены в зависимости от разделителя, который мы хотим использовать в конкретном типе данных.

Важные советы

Недавно я обнаружил одну проблему. Допустим, что мы просим пользователя ввести идентификатор сотрудника и имя сотрудника из консоли.

После чего мы будем читать ввод с консоли, используя сканер. Идентификатор сотрудника будет читаться с nextInt(), а имя сотрудника будет читаться как nextLine(). Это довольно просто, но это не сработает.

Приведенный выше пример не будет работать, потому что метод nextInt не читает последний символ новой строки вашего ввода и, следовательно, эта новая строка используется при следующем вызове nextLine.

Чтобы решить эту проблему, просто используйте next вместо nextline, но если вы хотите указать только nextLine, добавьте еще один scan.nextLine() после nextInt. Посмотрите ниже фрагмент кода:

Список методов java.util.Scanner

Ниже приведен список методов java.util.Scanner, которые мы можем использовать для сложного анализа ввода.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

С помощью класса java.util.Scanner можно анализировать простые типы данных и строки. Этот класс принимает данные из файлов, потоков, строк, последовательностей символов или байтов.

Для создания сканера используется конструктор Scanner , которому передаются входные данные и при необходимости тип кодировки.

Давайте рассмотрим конструкторы этого класса по порядку.

Конструктор public Scanner(Readable source)

Создает сканер, с помощью которого можно получить значения из источника, реализующего интерфейс Readable . Это могут быть объекты классов:

  • BufferedReader;
  • CharArrayReader;
  • CharBuffer;
  • FileReader;
  • FilterReader;
  • InputStreamReader;
  • LineNumberReader;
  • PipedReader;
  • PushbackReader;
  • Reader;
  • StringReader.

Вот как это делается с помощью класса FileReader :

Конструктор public Scanner(InputStream source)

Этот конструктор создает сканер, с помощью которого можно получить значения из указанного входного потока. Байты из такого потока преобразуются в символы (с использованием набора символов по умолчанию для базовой платформы).

Также есть вариант конструктора, который позволяет получать значения из входного потока, преобразовывая байты в символы с использованием набора символов, указанного пользователем:

public Scanner(InputStream source, String charsetName)

Если указанный набор символов не существует, выбрасывается исключительная ситуация IllegalArgumentException . Это справедливо для всех вариантов методов с указанием аргумента charsetName .

Например, для потока стандартного ввода он объявляется просто:

Scanner scanner = new Scanner(System.in)

Конструктор public Scanner(File source) throws FileNotFoundException

Создает сканер, который позволяет получать значения из указанного объекта класса java.io.File . Если указанный файл не найден, возникает исключительная ситуация FileNotFoundException . Символы преобразовываются в байты с использованием набора символов по умолчанию для базовой платформы.

Чтобы использовать произвольный набор символов, укажите его во втором аргументе:

public Scanner(File source, String charsetName) throws FileNotFoundException

Scanner scanner = new Scanner(new File("D:\Scanner.txt"));

Конструктор public Scanner(Path source) throws IOException

Создает сканер, который позволяет получать значения из указанного объекта, реализующего интерфейс java.nio.file.Path . При ошибке ввода-вывода возникает исключительная ситуация IOException . Символы преобразовываются в байты с использованием набора символов по умолчанию для базовой платформы.

Для использования другого набора символов укажите его во втором аргументе:

public Scanner(Path source, String charsetName) throws IOException

Давайте создадим сканер с помощью пути:

Конструктор public Scanner(String source)

Создает сканер, который позволяет получать значения из указанной строки:

Scanner scanner = new Scanner("Parse me");

Как прочитать файл с помощью класса Scanner

Чтобы прочитать файл с помощью класса Scanner , воспользуемся конструктором, принимающим объект класса java.io.File , и методами nextLine() и hasNextLine() :

Как прочитать ввод из консоли с помощью класса Scanner

Чтобы прочитать данные из консоли, создадим входной поток System.in и используем метод nextLine() :

Методы класса Scanner

Тип возврата Метод Описание
void close() Закрывает объект сканера.
Pattern delimiter() Возвращает шаблон, который объект Scanner в настоящее время использует для сопоставления разделителей.
String findlnLine(Pattern pattern) Этот метод возвращает объект String, который удовлетворяет объекту Pattern, указанному в качестве аргумента метода.
String findlnLine(String pattern) Пытается найти следующее вхождение шаблона, созданного из указанной строки, игнорируя разделители.
String findWithinHorizon(Pattern pattern, int horizon) Ищет следующее вхождение указанного шаблона.
String findWithinHorizon(String pattern, int horizon) Ищет следующее вхождение шаблона ввода, игнорируя разделитель
boolean hasNext() Возвращает true, если у этого сканера есть другой токен на входе.
boolean hasNext(Pattern pattern) Возвращает true, если следующий полный токен соответствует указанному шаблону.
boolean hasNext(String pattern) Возвращает true, если следующий токен соответствует шаблону, созданному из указанной строки.
boolean hasNextBig Decimal() Возвращает true, если следующий токен на входе этого сканера можно интерпретировать как BigDecimal с помощью метода nextBigDecimal().

Подробнее о сканере можно прочитать на сайте документации по Java.

Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .

Класс Scanner - 1

Привет! Наше сегодняшнее занятие будет особенным! До этого при решении задач и написании программ алгоритм был простым: мы пишем какой-то код, запускаем метод main() , программа делает то, что от нее требуется, и завершает свою работу. Но теперь всё изменится! Сегодня мы научимся по-настоящему взаимодействовать с программой: мы научим её реагировать на наши действия! Возможно, ты уже понял, к чему мы клоним. Эту лекцию посвятим подробному разбору одного из классов языка Java – Scanner. Этот класс пригодится, если тебе нужно будет считывать данные, которые вводят юзеры. Перед тем, как мы перейдем к изучению кода, скажи, тебе когда-нибудь приходилось встречаться с таким устройством как сканер? Наверняка да. Изнутри строение сканера достаточно сложное, но суть его работы довольно проста: он считывает те данные, которые пользователь в него вводит (например, паспорт или страховой полис) и сохраняет считанную информацию в памяти (например, в виде изображения). Так вот, сегодня ты создашь свой собственный сканер! С документами он, конечно, не справится, а вот с текстовой информацией — вполне :) Поехали!

Java Scanner Class

Класс Scanner - 2

Первое и главное, с чем нам нужно познакомиться, — класс java.util.Scanner . Его функциональность очень проста. Он, словно настоящий сканер, считывает данные из источника, который ты для него укажешь. Например, из строки, из файла, из консоли. Далее он распознает эту информацию и обрабатывает нужным образом. Приведем самый простой пример: Мы создали объект сканера и указали для него источник данных (строку с текстом). Метод nextLine() обращается к источнику данных (нашему тексту с четверостишием), находит там следующую строку, которую он еще не считывал (в нашем случае — первую) и возвращает ее. После чего мы выводим ее на консоль: Вывод в консоль: Мы можем использовать метод nextLine() несколько раз и вывести весь кусок поэмы: Каждый раз наш сканер будет делать один шаг вперед и считывать следующую строку. Результат работы программы — вывод в консоль: Как мы уже говорили, источником данных для сканера может быть не только строка, но и, например, консоль. Важная новость для нас: если раньше мы только выводили туда данные, теперь будем вводить данные с клавиатуры! Посмотрим, что еще умеет класс Scanner: Метод nextInt() считывает и возвращает введенное число. В нашей программе он используется для того, чтобы присвоить значение переменной number . Это уже больше похоже на настоящий сканер! Программа просит пользователя ввести в строку любое число. После того, как пользователь это сделал, программа благодарит его, выводит на консоль итог своей работы и завершается. Но у нас осталась одна серьезная проблема. Пользователь может ошибиться и ввести что-то не то. Вот пример, когда наша текущая программа перестанет работать: Попробуем ввести вместо числа строку “JavaRush”: Вывод в консоль: Ой-ой, все плохо -_- Во избежание подобных ситуаций нам нужно придумать способ проверки данных, которые вводит пользователь. Например, пользователь вводит что угодно, кроме числа, хорошо бы вывести в консоль предупреждение, что введенная информация не является числом, а если все в порядке — вывести текст подтверждения. Но для этого нам надо фактически “заглянуть в будущее” — узнать, что там дальше в нашем потоке. Умеет ли Scanner в Java это делать? Еще как умеет! И для этого у него есть целая группа методов: hasNextInt() — метод проверяет, является ли следующая порция введенных данных числом, или нет (возвращает, соответственно, true или false). hasNextLine() — проверяет, является ли следующая порция данных строкой. hasNextByte() , hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — все эти методы делают то же для остальных типов данных. Попробуем изменить нашу программу для чтения числа: Теперь наша программа проверяет, является ли следующий введенный символ числом или нет. И только в случае, если является, выводит подтверждение. Если же ввод не прошел проверку, программа это замечает и просит попробовать снова. По сути, ты можешь общаться с объектом Scanner и заранее узнавать, какой тип данных тебе ожидать. “Эй, сканер, что там дальше будет? Число, строка, или еще что? Число? А какое — int , short , long ?” Такая гибкость дает тебе возможность выстраивать логику своей программы в зависимости от поведения пользователя. Еще один важный метод, на который стоит обратить внимание — useDelimiter() . В этот метод передается строка, которую вы хотите использовать в качестве разделителя. Например, мы неожиданно увлеклись японской поэзией и решили считать с помощью сканера несколько хокку великого поэта Мацуо Басе. Даже если три разных стиха переданы нам одной корявой строкой, мы легко можем их разделить и красиво отформатировать: Мы используем в качестве разделителя строк метод useDelimeter() класса Scanner : он отвечает за деление входящих данных на части. В нашем случае для разделения строк в качестве аргумента передаётся и используется одиночная кавычка ( "'" ). Следующий за этой кавычкой текст отображается на новой строке, так как в цикле while мы используем метод println() класса System для считывания данных. В результате в консоли у нас появится красивый вывод, совсем как в книгах: В этом же примере есть еще один метод, на который нужно обязательно обратить внимание — close() . Как и любой объект, работающий с потоками ввода-вывода, сканер должен быть закрыт по завершении своей работы, чтобы больше не потреблять ресурсы нашего компьютера. Никогда не забывай о методе close() ! Вот и все! Как видишь, класс Scanner достаточно прост в использовании и очень полезен! :)

Scanner это класс в языке Java, который позволяет считывать данные из разных источников. В том числе и с консоли. Сегодня я хочу описать принципы его работы и показать на примере как можно прочитать ввод юзера в Java программу.

Класс сканер был создан для чтения данных из входящих потоков. Это может быть консоль приложения, файл и т.д.

Давайте теперь посмотрим, как его можно использовать чтобы считать пользовательский ввод с консоли и подать данные в программу.

Допустим у нас есть приложение при котором юзеру сначала нужно ввести цифры, а потом текст. Вот что получилось у меня:

В результате запуска приложения:

Как видите, код довольно простой. Чтобы вызвать методы класса Scanner нужно всего лишь написать Scanner scanner = new Scanner(System.in);

Внутри скобок (System.in); я передал систем ин так как хочу чтобы мой сканер считывал данные из консоли.

Чтобы считать данные из файла достаточно передать в скобки new File(“путь_к_файлу”).

В корне проекта я создал текстовый файл test.txt с содержимым:

Вот моя программа, которая считывает строку из файла с помощью класса Scanner:

В класс Scanner есть метод hasNextLine(), который возвращает true/false в зависимости от того есть ли еще строки в файле. Используя этот метод и цикл можно считать весь файл строка за строкой:

Мой исходный текстовый файл:

А вот результат работы приложения:

Причем программу выше можно немного оптимизировать и добавлять прочитанные строки к одной строке а потом можно вывести все целиком. Или можно как-то обработать строку в дальнейшем.

Это все что я хотел рассказать о классе Scanner. Он станет для Вас удобным инструментом для считывания данных с консоли или файла чтобы писать базовые интерактивные приложения на языке Java.

Я намеренно не стал рассказывать об остальных методах сканера, так как думаю что для новичков этого будет достаточно. Все остальное сможете посмотреть при непосредственном использовании Scanner.

Scanner Vertex Academy

Предлагаем вспомнить 2 примера из жизни, которые как нельзя кстати будут для изучения данной темы.

  1. Когда мы путешествуем, в аэропорту наш багаж пропускают через ленту со сканером. Вот она была наша сумка на входе. Просканировал сканер сумку и работник аэропорта четко знает что ж мы там такое везём в ней.
  2. Точно также работает сканнер в магазинах. Вот был штрих-код на входе, отсканировал штрих-код продавец и теперь всё-всё знает о продукте, который числится под этим штрих-кодом.

Чем то схожие задачи есть и в мире программирования на Java. Например, часто необходимо выполнить такие задачи:

  • Пользователь ввёл в консоли какое-то число. А программа должна считать с консоли, какое же число ввёл пользователь.
  • Пользователь ввёл в консоли какое-то слово. А программа должна считать с консоли, какое же слово ввёл пользователь.

Для решения таких задач в Java используется сканер (от англ. Scanner). Запомните: если что-то ввели в консоли, а нам надо считать что же именно ввели - используем сканер.

Итак, рассмотрим несколько примеров кода, после которых Вы:

  1. Поймёте на практике как работает сканер. Всего в статье будет 6 примеров кода. Рекомендуем все примеры кода запускать на своём компьютере и на практике изучать как это работает.
  2. Освоите 4 метода сканера:

Методы - это, грубо говоря, действия , которые может выполнять Scanner. На самом деле методов у сканера намного больше. Но на данном этапе Вам будет достаточно этих 4 методов. Ну что, поехали.

Пример №1 - с методом nextInt ()

Допустим, мы хотим, чтоб пользователь ввёл в консоль любое целое число от 1 до 10 , а программа вывела ему ответ, какое именно число он ввёл.

Поскольку нам необходимо как бы "сосканировать", какое число ввёл пользователь, всё логично - нам понадобится сканер. Ниже приводим решение и комментарии к решению.

Решение:

System . out . print ( "Введите любое целое число от 1 до 10: " ) ;

Если Вы попробуете запустить этот код на своём компьютере, то в консоли Вы увидите следующее:

Введите любое целое число от 1 до 10:

Затем, если Вы, например, введёте число 5, то в консоли будет следующее:

Введите любое целое число от 1 до 10: 5
Вы ввели число 5

Комментарии:

В статье "Что такое библиотека Java?" мы с Вами разобрались, что в Java есть огромная библиотека протестированного кода - это уже готовые решения ко многим задачам, которые стоят перед программистами в их ежедневной работе . Также мы говорили о различных пакетах, классах и методах. Так вот, сейчас мы будем с Вами работать с пакетом java.util. В этом пакете есть класс Scanner. И у него есть методы (действия), которые позволяют работать с вводом и выводом информации в консоль.

Сканер в Java

Но чтобы мы смогли использовать в нашем коде класс Scanner, нам необходимо сделать 3 шага.

Шаг №1 - обязательно прописать вот такую строчку в коде

Читайте также: