39 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Класс Scanner в Java — описание и пример использования

Класс сканера в Java

Scanner — это класс в пакете java.util, используемый для получения ввода примитивных типов, таких как int, double и т. Д., А также строк. Это самый простой способ чтения ввода в Java-программе, хотя и не очень эффективный, если вам нужен метод ввода для сценариев, где время является ограничением, как в конкурентном программировании.

  • Чтобы создать объект класса Scanner, мы обычно передаем предопределенный объект System.in, который представляет стандартный поток ввода. Мы можем передать объект класса File, если мы хотим прочитать ввод из файла.
  • Чтобы прочитать числовые значения определенного типа данных XYZ, используйте функцию nextXYZ (). Например, чтобы прочитать значение типа short, мы можем использовать nextShort ()
  • Для чтения строк мы используем nextLine ().
  • Чтобы прочитать один символ, мы используем next (). CharAt (0). Функция next () возвращает следующий токен / слово на входе в виде строки, а функция charAt (0) возвращает первый символ в этой строке.

Давайте посмотрим на фрагмент кода для чтения данных различных типов данных.

// Java-программа для чтения данных различных типов с использованием класса Scanner.

public class ScannerDemo1

public static void main(String[] args)

// Объявляем объект и инициализируем

// предопределенный стандартный объект ввода

Scanner sc = new Scanner(System.in);

String name = sc.nextLine();

char gender = sc.next().charAt( 0 );

// Числовой ввод данных

// можно прочитать байты, короткие и плавающие

// используя функции с похожими именами.

int age = sc.nextInt();

long mobileNo = sc.nextLong();

double cgpa = sc.nextDouble();

// Распечатать значения, чтобы проверить, был ли ввод получен правильно.

System.out.println( “Name: ” +name);

System.out.println( “Gender: ” +gender);

System.out.println( “Age: ” +age);

System.out.println( “Mobile Number: ” +mobileNo);

System.out.println( “CGPA: ” +cgpa);

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

Затем мы проверяем, имеет ли вход сканера нужный нам тип, с помощью функций hasNextXYZ (), где XYZ — это интересующий нас тип. Функция возвращает true, если у сканера есть токен этого типа, в противном случае — false. Например, в приведенном ниже коде мы использовали hasNextInt (). Чтобы проверить строку, мы используем hasNextLine (). Точно так же, чтобы проверить наличие одного символа, мы используем hasNext (). CharAt (0).

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

// Java-программа для чтения некоторых значений с помощью Scanner
// Класс и напечатать их среднее.

public class ScannerDemo2

public static void main(String[] args)

// Объявляем объект и инициализируем

// предопределенный стандартный объект ввода

Scanner sc = new Scanner(System.in);

// Инициализируем сумму и количество входных элементов

int sum = 0 , count = 0 ;

// Проверяем, доступно ли значение int

// Чтение значения типа int

int num = sc.nextInt();

int mean = sum / count;

System.out.println( “Mean: ” + mean);

Эта статья предоставлена Сукрит Бхатнагар . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Вводный курс. Язык программирования Java

9. Ввод данных. Класс Scanner

Класс Scanner используется для считывания введенных пользователем данных следующих типов: String, byte, short, int, long, float, double.

В Java при работе со строками используется понятие токен. Токен – это подстрока, не содержащая разделителей и ограниченная слева и справа разделителями. Стандартными разделителями являются: пробел ‘ ‘ , символ тубуляции ‘t’ , перевода строки ‘n’ и возврата каретки ‘r’ , например, строка

“Университетский центр Турбо”

содержит три токена:

В этом примере использовался стандартный разделить – пробел. При необходимости можно задать собственный разделить, который доложен иметь тип String .

Вернемся к сканеру. Сканер выполняет поиск токенов во входной строке. Для работы со сканером необходимо создать объект класса Scanner, указав с какими потоками ввода/вывода он будет связан:

  • Стандартный поток ввода – это клавиатура представлен объектом — System.in.
  • Стандартный поток вывода – это дисплей представлен объектом System.out.
  • Потоком ввода может быть файл , например,
  • а также строка, определенная в коде программы, например,

Пример. Создаем объект класса Scanner и связываем его с клавиатурой для ввода данных с клавиатуры:

Scanner scan = new Scanner(System.in);

Класс Scanner имеет следующие основные методы:

  • next() считывает введенную строку
  • nextBoolean() считывает введенное логическое значение
  • nextInt() считывает введенное целое число типа int
  • nextFloat() считывает введенное вещественное число типа float
  • nextDouble() считывает введенное вещественное число типа double
  • nextLine( ) считывает введенную всю строку до символа перехода на новую строку.

Если считываемый тип данных не соответствует используемому типу метода сканера, то возникнет ошибка времени выполнения программы, например, читаем целое число, а пользователь вводит дробное. Для того чтобы избежать подобных ошибок используются методы проверки считываемых типов:

  • boolean hasNextLine() : вернет true если следующим значением является строка, иначе — false;
  • boolean hasNextInt(): вернет true если значением является значение типа int;
  • boolean hasNextFloat() : вернетtrue если следующим значением является значение типаfloat;

Пример. Чтение целого числа

Пример. Чтение вещественного числа

По умолчанию дробное число вводится через запятую. Если требуется вводить число через точку, необходимо установить локаль:

Пример. Чтение последовательности целых чисел

При вводе числа отделяются между собой нажатием клавиши «Enter» или пробелом. Ввод прервется, если будет введено не целое число.

Пример. Ввод строки

Пример. Обработка строки, заданной в коде программы

Пример. Чтение файла

При использовании кириллицы файл должен иметь кодировку UTF-8.

Использование класса Scanner в Java — примеры и методы

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

Класс Scanner имеет богатый набор API, который обычно используется для разбиения входных данных конструктора Scanner на токены. Входные данные разбиваются на токены с помощью разделителя, определенного в классе Scanner с использованием метода radix, или могут быть определены.

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

Конструкторы класса Scanner — public Scanner(Readable source)

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

Параметры: source — источник символов, реализующий интерфейс Readable

Читать еще:  Почему сильно шумит вентилятор в системном блоке?

Не путайте с типом объекта, доступным для чтения в качестве параметра конструктора. Readable — это интерфейс, который был реализован с помощью BufferedReader, CharArrayReader, CharBuffer, FileReader, FilterReader, InputStreamReader, LineNumberReader, PipedReader, PushbackReader, Reader, StringReader.

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

public Scanner(InputStream source)

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

Параметры: источник — входной поток для сканирования.

Метод ввода этого конструктора — InputStream. Класс InputStream является одним из классов верхнего уровня в пакете java.io, и его использование будет проблемой.

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

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

Байты из файла преобразуются в символы с кодировкой по умолчанию базовой платформы.
Параметры: источник — файл для сканирования

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

public Scanner(Path source) throws IOException

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

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.

Класс Scanner в Java — описание и пример использования

Для получения данных, введенных пользователем, а также для вывода сообщений нам необходим ряд классов, через которые мы сможем взаимодействовать с консолью. Частично их использование уже рассматривалось в предыдущих темах. Для взаимодействия с консолью нам необходим класс System . Этот класс располагается в пакете java.lang, который автоматически подключается в программу, поэтому нам не надо дополнительно импортировать данный пакет и класс.

ВЫВОД НА КОНСОЛЬ.

Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку:

В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.

Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность n:

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

Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf() . С ее помощью мы можем переписать предыдущий пример следующим образом:

В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго — значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений типа int .

Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:

  • %x : для вывода шестнадцатеричных чисел
  • %f : для вывода чисел с плавающей точкой
  • %e : для вывода чисел в экспоненциальной форме, например, 1.3e+01
  • %c : для вывода одиночного символа
  • %s : для вывода строковых значений

При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:

КОНСОЛЬНЫЙ ВВОД

Для получения консольного ввода в классе System определен объект in . Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner , который, в свою очередь использует System.in. Например, создадим маленькую программу, которая осуществляет ввод чисел:

Так как класс Scanner находится в пакете java.util, то мы вначале его импортируем. Для создания самого объекта Scanner в его конструктор передается объект System.in . После этого мы можем получать вводимые значения. Например, чтобы получить введенное число, используется метод in.nextInt(); , который возвращает введенное с клавиатуры целочисленное значение.

В данном случае в цикле вводятся все элементы массива, а с помощью другого цикла все ранее введенные элементы массива выводятся в строчку.

Читать еще:  Как проверить, не попал ли ваш почтовый ящик в базы похищенных email

Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения:

  • next() : считывает введенную строку до первого пробела
  • nextLine() : считывает всю введенную строку
  • nextInt() : считывает введенное число int
  • nextDouble() : считывает введенное число double
  • hasNext() : проверяет, было ли введено слово
  • hasNextInt() : проверяет, было ли введено число int
  • hasNextDouble() : проверяет, было ли введено double

Кроме того, класс Scanner имеет еще ряд методов nextByte/nextShort/nextFloat/nextBoolean , которые по аналогии с nextInt считывают данные определенного типа данных.

Создадим следующую программу для ввода информации о человеке:

Java Scanner Class Example | Scanner Class in Java

Java Scanner class is present in the java.util package. Java has various way to take input from the keyboard and java.uti.Scanner class is one of them. Java Scanner class breaks an input into the2e tokens using the delimiter which is considered as whitespace.

It provides various methods to parse and read primitive values like int, float, sort, long, string, etc. If we want to use the Scanner class, create an object of the class and use any of the available methods found in a Scanner class documentation.

Java Scanner Class

In Java, we can input with the help of the Scanner class. Java has several predefined classes which we can use. We will learn more about the classes later. The predefined classes are organized in the form of packages. Java Scanner class is found in the java.util package.

Java Scanner Class Declaration

See the following code.

If we need to import a class or a package, add one of the following lines to the very beginning of your code.

We can use either of the above lines. The first line only imports the Scanner class and the second line imports the whole java.util package.

After importing the class, we need to write the following statement in our program that will create an object of Scanner class.

At this moment writing Scanner s, we are declaring s as an object of Scanner class. System.in within the round brackets tells Java that this will be System Input, i.e., input will be given to the system.

Example of Scanner Class in Java

See the below code example.

See the below output.

Key Points about Java Scanner Class

  1. If we want to create an object of Scanner class, we need to pass the System.in as an argument if we’re going to take input from the keyboard. If we’re going to receive input from a file, then we need to pass the file object of the class file.
  2. If we want to take input for the primitive type we have to write nextABC(); here ABC is a primitive type. For example, if we’re going to take input of a short type, then we need to declare like nextShort().
  3. If we want to take input for string, we nextLine() is used.
  4. If we want to take input for the character, we have to use next().

Java Scanner Class Constructors

There are various types of the constructor are there which are used to Initialize or to take values. Now we are going to discuss some of the useful constructors one by one.

Scanner (File source)

Constructs the new scanner that produces values scanned from a specified file. If the source file is not found, a FileNotFoundException is thrown. Since it is a checked exception, it must be caught or forwarded by putting the phrase “throws FileNotFoundException” in the method header.

See the following output.

Scanner (InputStream source)

Constructs the new Scanner object that produces values scanned from a specified input stream.

Scanner (String source)

Constructs the new scanner object that produces values scanned from a specified string.

Scanner Class Various Methods

Now we’ll learn about various types of methods that belong to Scanner class.

delimiter()

The delimiter is the sequence of one or more characters used to specify the boundary between separate, independent regions in the plain text or other data streams. An example of the delimiter is the comma character, which acts as a field delimiter in a sequence of the comma.

Note: It can only be used Java 1.5 and above version

close()

The close() method is used to close the Scanner class.

Syntax: public void close();

It takes no parameter and also doesn’t return any value.

toString()

The toString() method of Java Scanner class is used to get the string representation of Scanner object. The string representation of the Scanner contains the information which is useful for debugging purpose.

Some times we have to check if the next input is the specified type or it has ended (EOF is there).

If we want to check this, we have a general format(method) for all the primitive datatypes.

The format is: hasNextXYZ(); where primitive types are represented as XYZ, i.e., int, float, long, boolean, etc.

If we have to find the next value is an int or not then the method will be like hasNextInt().

Similarly for String input we have method hasNextLine() and to check the first letter of any character we have hasNext.charAt( )

See the below output.

useDelimiter()

This method is used to set the delimiting pattern of the Scanner which is in use. We are going to discuss them one by one.

Syntax: public Scanner useDelimiter(Pattern pattern);

See the below code example.

ioException()

The ioException() method of java.util.Scanner class returns the IOException last thrown by this Scanner’s underlying Readable.

Syntax: public IOException ioException()

It returns the last exceptions thrown by Scanner’s readable.

See the below output.

These were all about important methods and points of Scanner class.

Conclusively, Java Scanner Class Example is over.

Ankit Lathiya is a Master of Computer Application by education and Android and Laravel Developer by profession and one of the authors of this blog.

Javist

Свежие записи

Сканирование текста с java.util.Scanner

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

Читать еще:  Почему экран растянут по горизонтали?

Перед J2SE 5.0 релиз, вы, вероятно, пишет код, такой как следующий класс TextReader читать текст из файла:

public class TextReader <

private static void readFile ( String fileName ) <

File file = new File ( fileName ) ;

FileReader reader = new FileReader ( file ) ;

BufferedReader in = new BufferedReader ( reader ) ;

while (( string = in.readLine ()) != null ) <

> catch ( IOException e ) <

public static void main ( String [] args ) <

if ( args.length != 1 ) <

System.err.println ( “usage: java TextReader “

readFile ( args [ 0 ]) ;

Основной подход в классах, как это создать файл, объект, соответствующий фактический файл на жестком диске. Класс затем создает FileReader связанный с файлом, а затем BufferedReader от FileReader. Затем он использует BufferedFile читателя прочитать файл по одной строке за раз.

Для просмотра класс TextReader в действии, вы должны создать документ для данного класса чтения и синтаксического анализа. Чтобы создать документ, сохранить следующие две строки текста в файле с именем TextSample.txt в том же каталоге, TextReader:

Обобщение TextReader “. Затем запустите ее, введя следующее:

Вы должны увидеть оригинальный файл повторил обратно к вам в стандартный вывод.

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

public class TextScanner <

private static void readFile ( String fileName ) <

File file = new File ( fileName ) ;

Scanner scanner = new Scanner ( file ) ;

> catch ( FileNotFoundException e ) <

public static void main ( String [] args ) <

if ( args.length != 1 ) <

System.err.println ( “usage: java TextScanner1”

readFile ( args [ 0 ]) ;

Обобщение TextScanner. Затем запустите его следующим образом:

Вы должны получить следующие результаты:

TextScanner создает объект сканер из файла. Сканер перерывы содержимое файла в лексемы помощью разделяющем шаблоне, по умолчанию разделителем шаблон пробелом. TextScanner затем вызывает hasNext () в сканере. Этот метод возвращает значение “истина, если другой знак существует во входных сканера, как это имеет место, пока не достигнет конца файла. Следующий () возвращает строку, которая представляет собой следующий жетон. Так до достижения конца файла, TextScanner печатает строку, вернулись к следующему () на отдельной строке.

Вы можете изменить разделители, используемые для Разбивает вход, через useDelimiter метода сканера. Вы можете передать в строку или java.util.regex.Pattern методу. См. страницу Javadocs за образец для информации о том, что модели могут быть применены. Например, вы можете прочитать ввод одной строке за раз, используя символ новой строки (\ п) в качестве разделителя. Вот пересмотренный ReadFile () метод TextScanner который использует символы новой строки в качестве разделителя:

private static void readFile ( String fileName ) <

Scanner scanner = new Scanner ( new File ( fileName )) ;

> catch ( FileNotFoundException e ) <

Обратите внимание, что существуют и другие возможности для обнаружения конца строки. Можно, например, тест на линиях, которые заканчиваются символом новой строки или заканчиваться символом возврата каретки и символа новой строки. Вы можете сделать это с использованием регулярных выражений “\ R \ N | \ N”. Javadocs для java.util.regex.Pattern показаны другие возможные терминаторы строки, так что более полная проверка будет использовать выражение “\ R \ п | [\ R \ N \ u2028 \ u2029 \ u0085]”. Вы также можете использовать hasNextLine () и nextLine () методы из класса сканера. В любом случае, с пересмотренным TextScanner, результат должен соответствовать содержанию и макет TextSample.txt. Другими словами, вы должны увидеть следующее:

Простой смене шаблона в разделитель используются сканер дает вам большую силу и гибкость. Например, если задать следующий разделитель:

В ней написано весь файл сразу. Это похоже на хитрость предложила Пэт Нимайер java.net в своем блоге. Вы можете читать все содержимое веб-страницы без создания нескольких промежуточных объектов. Код следующий класс, WebPageScanner, говорится в текущем содержании java.net Домашняя страница:

public class WebPageScanner <

public static void main ( String [] args ) <

new URL ( “http://java.net” ) .openConnection () ;

String text = new Scanner (

useDelimiter ( “\Z” ) .next () ;

> catch ( IOException e ) <

Вы можете обрабатывать более строк с классом сканера. Вы также можете использовать сканер для анализа данных, который состоит из примитивов. Чтобы проиллюстрировать это, сохранить следующие три строки в файле с именем Employee.data (в том же каталоге, TextSample):

Вы все еще рассматривает это как одно большое струнных и выполнять переходы после разбора строки. Вместо этого, вы можете разобрать этот файл в два этапа. Это показано в следующем классе, DataScanner:

public class DataScanner <

private static void readFile ( String fileName ) <

new Scanner ( new File ( fileName )) ;

> catch ( FileNotFoundException e ) <

private static void parseLine ( String line ) <

Scanner lineScanner = new Scanner ( line ) ;

String name = lineScanner.next () ;

int age = lineScanner.nextInt () ;

boolean isCertified = lineScanner.nextBoolean () ;

System.out.println ( “It is ” + isCertified +

” that ” + name + “, age “

+ age + “, is certified.” ) ;

public static void main ( String [] args ) <

if ( args.length != 1 ) <

System.err.println ( “usage: java TextScanner2”

readFile ( args [ 0 ]) ;

Космический объект в DataScanner Сканер считывает файл по одной строке за раз. ReadFile () метод проходит каждую строку второго сканера. Второй сканера анализирует разделенные запятыми данные и удаляет пробелы с обеих сторон запятыми. Существуют варианты hasNext () и Next () методы, которые позволят вам проверить является ли следующий маркер определенного типа и пытаться лечить следующий знак в качестве примера такого рода. Например, nextBoolean () пытается относиться к следующей лексемы как логическое и пытается сопоставить его либо строка “Правда” или строку “ложным”. Если матч не может быть сделано, генерируется java.util.InputMismatchException. ParseLine () Метод DataScanner показано, как каждая строка анализируется в строку, INT, и логическое значение.

Обобщение DataScanner. Затем запустите его следующим образом:

Вы должны получить следующие результаты:

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

Это приведет к InputMismatchException. Это потому, что дополнительное пространство будет включено в знак того, что вы пытаетесь преобразовать в логические и пространства не совпадают ни с “истинным” или “ложь”. Как и в случае со всеми приложениями регулярных выражений, основная власть требует, чтобы вы Уделите побольше внимания при построении вашей модели.

Для более подробной информации о сканере, см. официальную документацию.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: