Java’s Scanner : our implementation
On France-IOI, we are using the gcj compiler to compile Java’s source codes into executables.
We have our own implementation of the Java’s Scanner.
- It fixes speed and memory usage problems (see below).
- It fixes some gcj’s Scanner «bugs» (see below)
- It hasn’t all the original functions
Example of use
Exactly as you would use the original Java’s Scanner :
Scanner sc = new Scanner(System.in);
int val = sc.nextInt()
Supported functions
Original functions :
public boolean hasNext();
public String next();
public String nextLine();
public int nextInt();
public long nextLong();
public float nextFloat();
public double nextDouble();
Added functions :
Bugs fixed
Using nextDouble()
to read the value 0
raises the error ava.util.InputMismatchException: "0" is not a double
.
See http://stackoverflow.com/questions/9055788/java-scanner-0-is-not-a-double for more details.
Our Scanner fixes that
Speed and memory usage
For this benchmark we are reading N
integers on standard input, the most common usage in algorithmic contests.
Comparison of Java's Scanner / our Scanner
For 10 integers :
Time : .07s vs .07s
Memory : 25164K vs 20760K
Ratios (time/mem) : 1.0 and 1.2
For 5000 integers :
Time : .26s vs .08s
Memory : 30036K vs 21596K
Ratios (time/mem) : 3.2 and 1.3
For 10000 integers :
Time : .44s vs .06s
Memory : 30956K vs 22380K
Ratios (time/mem) : 7.3 and 1.3
For 25000 integers :
Time : 1.02s vs .07s
Memory : 34464K vs 23704K
Ratios (time/mem) : 14.5 and 1.4
For 50000 integers :
Time : 1.97s vs .11s
Memory : 39596K vs 25788K
Ratios (time/mem) : 17.9 and 1.5
For 75000 integers :
Time : 2.93s vs .20s
Memory : 44988K vs 26060K
Ratios (time/mem) : 14.6 and 1.7
For 100000 integers :
Time : 3.85s vs .23s
Memory : 50456K vs 26056K
Ratios (time/mem) : 16.7 and 1.9
For 150000 integers :
Time : 5.68s vs .27s
Memory : 60648K vs 26060K
Ratios (time/mem) : 21.0 and 2.3
For 200000 integers :
Time : 6.86s vs .37s
Memory : 75148K vs 26320K
Ratios (time/mem) : 18.5 and 2.8
Мы рассмотрим класс Java под названием Scanner, который позволяет сохранить и обработать ввод пользователя с клавиатуры, превращая его в Java-код. Класс Scanner имеет разные методы получения информации в зависимости от типа переменной.
Одна из сильных сторон Java — это огромные доступные библиотеки кода. Это код, который был написан для выполнения определенной работы. Все, что вам нужно сделать, это указать, какую библиотеку вы хотите использовать, а затем вызвать метод в действие.
Один действительно полезный класс в Java, который обрабатывает ввод пользователя, называется классом Scanner. Класс Scanner можно найти в библиотеке java.util.
Чтобы использовать класс Scanner, вам нужно сослаться на него в своем коде. Это делается с помощью импорта ключевых слов.
import java.util.Scanner;
Оператор import должен находиться чуть выше оператора Class:
import java.util.Scanner; public class StringVariables { }
Это говорит Java, что вы хотите использовать определенный класс в определенной библиотеке — класс Scanner, который находится в библиотеке java.util.
Следующее, что вам нужно сделать, это создать объект из класса Scanner. (Класс — это просто набор кода. Он ничего не делает, пока вы не создадите из него новый объект.)
Для создания нового объекта Scanner напишите код:
Scanner user_input = new Scanner(System.in, "Cp1251");
Вместо того, чтобы устанавливать переменную int или переменную String, мы настраиваем переменную Scanner. Мы назвали ее user_input.
После знака равенства у нас есть ключевое слово new. Оно используется для создания новых объектов из класса.
Мы создаем объект из класса Scanner. В скобках мы говорим Java, что это будет System Input и русская кодировка, чтоб ввод был распознан как русский текст (System.in, «Cp1251»).
Чтобы получить пользовательский ввод, вы можете вызвать в действие один из методов, доступных для объекта Scanner.
Методы класса Scanner, которые обрабатывают ввод пользователя в Java:
- next(): получает введенную строку до первого пробела
- nextLine(): получает всю введенную строку
- nextInt(): получает введенное число int
- nextDouble(): получает введенное число double
- nextBoolean(): получает значение boolean
- nextByte(): получает введенное число byte (число от -128 до 127)
- nextFloat(): получает введенное число float
- nextShort(): получает введенное число short (число от -32768 до 32767)
Для нашего нового объекта Scanner мы будем использовать метод next:
String first_name; first_name = user_input.next();
Чтоб увидеть весь список доступных методов, введите после нашего объекта user_input точку. Нам нужен next. Дважды кликните по next и введите точку с запятой, чтобы завершить строку. Также мы напечатаем некоторый текст, как предложение о вводе данных:
String first_name; System.out.print("Введите имя: "); first_name = user_input.next();
Обратите внимание, что мы использовали print, а не println, как в прошлый раз. Разница между ними заключается в том, что println переместит курсор на новую строку после вывода, а print оставит курсор на той же строке.
Также мы добавим предложение о вводе фамилии:
String family_name; System.out.print("Введите фамилию: "); family_name = user_input.next();
Это тот же код, за исключением того, что java теперь будет хранить все, что пользователь вводит, в нашу переменную family_name вместо переменной first_name.
Чтобы распечатать ввод, мы можем добавить следующее:
String full; full = first_name + " " + family_name; System.out.println("Вас зовут " + full);
Мы установили еще одну переменную String — full. В ней мы сохраним все, что есть в двух переменных first_name и family_name (в строке ввода ввел пользователь). Между ними мы добавили пробел. Последняя строка выводит все это в окно вывода.
Адаптируйте ваш код так, чтобы он соответствовал следующему изображению:
Запустите программу, и в окне «Вывод» отобразится следующее:
На этом этапе Java приостанавливается, пока вы не введете что-либо на клавиатуре. Работа кода не продолжиться, пока вы не нажмете клавишу ввода. Итак, кликните левой кнопкой мыши после «Введите имя:», и вы увидите, что курсор мигает. Введите имя и нажмите клавишу ввода на клавиатуре.
После того, как вы нажмете клавишу ввода, java возьмет то, что было набрано, и сохранит его в имени переменной слева от знака равенства. Для нас это была переменная с именем first_name.
Затем программа переходит к следующей строке кода:
Введите фамилию и снова нажмите клавишу ввода:
Пользовательский ввод завершен, а остальная часть программы выполняется. Это вывод двух имен. Конечный результат должен выглядеть так:
Таким образом, мы использовали класс Scanner для получения ввода от пользователя. Все, что было напечатано, сохранилось в переменных. Затем результат был напечатан в окне вывода.
В следующем уроке мы кратко рассмотрим класс JOptionPane.
Overview
One of the most basic yet very important functionalities of any programming language is to successfully take input from the user and displaying the correct output. A programming language would be of no use without these two functions. Java, being a programming language, also offers these functionalities that allow a Java program to take input and display the output to the user. The output on the screen is printed using System.out.print() and System.out.println() functions in Java. These functions are part of the Java Scanner class.
In this article, you will discuss the input functionality of the Java language using the Java’s Scanner class. We will also learn about the various methods offered by the scanner class in Java with the aid of examples.
Scanner Java class is part of the Java.util package. It is used to get input from the user during runtime. The input is supposed to be of primitive data types, like int, float, double, string, etc.
There are different functions in Java’s Scanner Class used to take input directly from the user or read from a file. For instance, nextint() is used to take integer type input, and nextfloat() is for float type input. Similarly, nextLine() and next() are used for string type and char type inputs. Although these functions are the easiest methods to read the input, these are often not the most efficient ones.
How To Import Java Scanner Class?
Like any other class, The package of the Scanner class java.util.Scanner is needed to be imported first to use the Java’s Scanner class. Either of the following statements can be used to import the Java’s Scanner class and its functionality in your program.
import java.util.Scanner;
OR
import java.util.*
Creating a Scanner Class Object
After importing the package, the following lines of codes can be used to create an object of the Scanner class. It can read input from a File, InputStream, and a String respectively.
1. //read input from a file (“myFile”) 2. Scanner sc01 = new Scanner(File “myFile”); 3. //read input from the input stream 4. Scanner sc02 = new Scanner(inputStream input); 5. //read input as a String 6. Scanner sc03 = new Scanner(String str);
Java Scanner Methods
After creating a Scanner object, now we can use a method to take input of a data type. As discussed before, the Scanner class provides a lot of methods that can be used to read inputs of different data types.
The following table shows some commonly used Scanner functions to read input from the user along with their respective data types:
Method | Data Type |
nextInt() | Int |
nextFloat() | Float |
nextBoolean() | Boolean |
nextLine() | String |
next() | String |
nextByte() | Byte |
nextDouble() | Double |
The following series of codes demonstrate the use of some of the Java’s Scanner methods along with their outputs:
· Java Scanner nextInt() method
1. import java.util.Scanner; 2. class Main { 3. public static void main(String[] args) { 4. // creating a Java's Scanner object 5. Scanner inputInteger = new Scanner(System.in); 6. System.out.println("Please enter an integer: "); 7. // Takes an integer value 8. int input01 = inputInteger.nextInt(); 9. System.out.println("Output using nextInt(): " + input01); 10. inputInteger.close(); 11. } 12.}
This is the output of this code,
Please enter an integer: 45 Output using nextInt(): 45
· Java Scanner nextDouble() method
1. import java.util.Scanner; 2. class Main { 3. public static void main(String[] args) { 4. // creating a Scanner object 5. Scanner inputDouble = new Scanner(System.in); 6. System.out.print("Enter a Double value: "); 7. // takes the double value as input 8. double data = inputDouble.nextDouble(); 9. System.out.println("Output using nextDouble(): " + data); 10. input.close(); 11. } 12. }
Following is the Output,
Enter a Double value: 3.142 Output using nextDouble(): 3.142
· Java Scanner next() method
1. import java.util.Scanner; 2. class Main { 3. public static void main(String[] args) { 4. // creating a scanner object 5. Scanner inputWords = new Scanner(System.in); 6. System.out.print("Enter names of three animals: "); 7. // reads a single word 8. String word = inputWords.next(); 9. System.out.println("Output using next(): " + word); 10. input.close(); 11. } 12. }
Following will be the Output,
Enter names of three animals: cat sheep goat Output Using next(): cat
Here, I have provided three words. However, the next() method only reads the single word. This is because the next() method reads input up to the first whitespace character. As it encounters whitespace, it returns the string (without the whitespace).
· Java Scanner nextLine() method
1. import java.util.Scanner; 2. class Main { 3. public static void main(String[] args) { 4. // creating a scanner object 5. Scanner inputLine = new Scanner(System.in); 6. System.out.print("Please enter your full name: "); 7. // takes the entire line as input 8. String name = inputLine.nextLine(); 9. System.out.println("Output using nextLine() method: " + name); 10. inputLine.close(); 11. } 12. }
The output will be:
Please enter your full name: Shaharyar Lalani Output using nextLine() method: Shaharyar Lalani
The nextLine() method is used to read a string from the user. Unlike the next() method, the nextLine() method reads the entire line of input with white spaces. The method is only terminated when a next line character, n is encountered.
Java Scanners Class Constructor
Like any other class, the Java’s Scanner class contains various overloaded constructors that offer various input methods like System.in, file input, path, etc. The input can be a file object as well, which allows a Java program to take input from a file.
Constructor | Description |
Scanner(File FileSourceName) | It creates a new Scanner that scans from the FileSourceName. |
Scanner(inputStream inputStreamSource) |
It creates a new scanner that scans from the inputStreamSource passed as a parameter. |
Scanner(Readable ReadableSource) |
It creates a new scanner that scans from the ReadableSource passed as a parameter. |
Scanner(String StringSource) |
It creates a new scanner that scans from the StringSource passed as a parameter. |
Scanner(ReadableByteChannel ChannelSource) |
It creates a new scanner that scans from the ChannelSource. |
Scanner(Path PathSource) |
It creates a new scanner that scans from the PathSource mentioned. |
All the above constructors can be overridden by adding another parameter, charsetName of string data type.
Java Scanners Class Delimiters
Scanner Java class can also be used to split the input. The default delimiter is the whitespace that is why we get the spaces in between the tokens, but users can also specify the delimiter of their choice by a simple change in Code.
Following is the Java code snippet for Scanner delimiter usage:
1. import java.util.*; 2. public class DelimiterExample { 3. public static void main(String[] args) { 4. Scanner sc = new Scanner(“44, 98, 32, 37”); 5. sc.useDelimiter(“\s*, \s*); 6. while(sc.hasNext()) { 7. System.out.println(sc.nextInt()); 8. } 9. } 10. }
Output:
44 98 32 37
In this example, ‘,’ (comma) is accompanied by any number of spaces before and after it has been set as a delimiter so when a comma is found in the input, the data will be separated with a new line.
It can be very helpful if your existing data is present in a certain format and you want to change it when read in from the file.
Drawbacks Of Java Scanner Class
Although the Scanner Java class seems very useful when taking the input at run time, there are some drawbacks of using the Scanner class in Java. A java developer must keep the following points in account when using the Scanner Java class.
When any next<xxx>() method is utilized after the nextLine() method, the input entered during the execution of nextLine() method is ignored. This makes it not a very efficient way to take input in Java as it can ultimately result in unexpected output and if a Java developer is not fully aware of this scenario, it might get very frustrating for you to find the error.
See Also: Inheritance In Java: Inheritance Types With Example
This happens because the values entered with the nextLine() method get ignored by the console, and that step is ignored altogether. The Scanner class in Java is also relatively slower as it takes significant time when the input data gets parsed in the Scanner class.
Conclusion
This was all about the Scanner class in Java. We have covered all the details about the Java’s Scanner class, including how to import the Scanner class, how to create an object, and how to use the functions with various examples. Java Scanner constructor and Java delimiters are also covered. Along with that, we discussed the certain drawbacks of using the Scanner Java class that you should be aware of. It is a very easy-to-use method to take input if effectively implemented and the user is fully aware of the problems that may arise.
Одна из замечательных особенностей языка программирования заключается в том, что мы можем писать программы, с которыми могут взаимодействовать пользователи. Программирование на Java позволяет пользователю вводить данные с помощью класса Scanner. Это встроенный в java класс, присутствующий в пакете java.util. Класс Scanner предоставляет несколько методов, которые можно использовать для выполнения различных функций, таких как чтение, анализ данных и т. д. В Java класс сканера является одним из самых простых, легких и наиболее широко используемых способов получения ввода от пользователей.
В этой статье представлен исчерпывающий обзор того, как получить пользовательский ввод в java, и в связи с этим в этой статье будут рассмотрены следующие аспекты Scanner Class.
Содержание
- Java Scanner Class
- Как импортировать класс сканера
- Как создать объект класса сканера
- Различные методы класса сканера
- Практическая реализация класса сканера в Java
- Заключение
Java Scanner Class
Он принадлежит пакету java.util и может использоваться для ввода строковых и примитивных типов, таких как int, char, float и т. д. Чтобы работать с классом сканера Java, мы должны выполнить следующие шаги:
- Импортируйте класс сканера,
- Создайте объект класса Scanner.
- Используйте встроенные методы класса Scanner для ввода данных пользователем.
Как импортировать класс сканера
Изначально нам нужно импортировать класс Scanner в наш проект, и для этого нам нужно написать следующий фрагмент кода:
Как создать объект класса сканера
Импорт класса сканера позволит нам создать объект класса сканера, и для этого нам нужно следовать приведенному ниже синтаксису:
Scanner scan = new Scanner(System.in);
Здесь, в приведенном выше фрагменте кода, System.in — это предопределенный объект, представляющий поток ввода.
Различные методы класса сканера
На данный момент мы закончили импорт класса сканера и создание объекта этого класса в нашем проекте. Теперь мы можем использовать любые встроенные методы класса Scanner, такие как next(), nextLine(), nextShort() и многие другие.
Чтобы прочитать любые числовые данные или короткие данные, все, что вам нужно сделать, это просто указать тип данных вместе с «далее», за которым следуют круглые скобки, как показано ниже:
- метод nextInt() для получения целочисленного значения,
- метод nextShort() для получения значения типа данных short и так далее.
Одним из наиболее значимых и широко используемых методов класса Scanner является метод nextLine(), который используется для чтения строк.
Практическая реализация класса сканера в Java
Для более глубокого понимания давайте реализуем вышеупомянутые концепции на примере.
Пример
Приведенный ниже код поможет лучше понять, как получать данные от пользователей с помощью класса Scanner:
import java.util.Scanner;
public class UsersInput {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println(«Please Enter the Name of Employee: «);
String empName = scan.nextLine();
System.out.println(«Please Enter the ID of Employee: «);
int empId = scan.nextInt();
System.out.println(«Employee Name :» + empName);
System.out.println(«Employee ID :» + empId);
}
}
В приведенном выше фрагменте мы берем имя и идентификатор сотрудника от пользователя, полный код и соответствующий вывод показаны на следующем снимке экрана:
Вывод подтверждает, что класс сканера работает, поскольку он успешно получает данные от пользователя.
Заключение
В Java для получения информации от пользователей все, что вам нужно сделать, это импортировать класс Scanner из пакета java.util, затем создать объект этого класса и использовать встроенные методы класса для выполнения различных функций. Класс Scanner предоставляет широкий спектр методов для чтения значений различных типов данных, например, методы nextLine(), nextInt() и nextByte() могут использоваться для чтения строковых, целочисленных и байтовых данных соответственно от пользователя. Есть еще много методов/функций, которые можно использовать для различных целей. В этой статье представлено полное понимание того, что такое класс сканера и как работать с классом сканера.
The Scanner
class of the java.util
package is used to read input data from different sources like input streams, users, files, etc. Let’s take an example.
Example 1: Read a Line of Text Using Scanner
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// creates an object of Scanner
Scanner input = new Scanner(System.in);
System.out.print("Enter your name: ");
// takes input from the keyboard
String name = input.nextLine();
// prints the name
System.out.println("My name is " + name);
// closes the scanner
input.close();
}
}
Output
Enter your name: Kelvin My name is Kelvin
In the above example, notice the line
Scanner input = new Scanner(System.in);
Here, we have created an object of Scanner
named input.
The System.in
parameter is used to take input from the standard input. It works just like taking inputs from the keyboard.
We have then used the nextLine()
method of the Scanner
class to read a line of text from the user.
Now that you have some idea about Scanner
, let’s explore more about it.
Import Scanner Class
As we can see from the above example, we need to import the java.util.Scanner
package before we can use the Scanner
class.
import java.util.Scanner;
To learn more about importing packages, visit Java Packages.
Create a Scanner Object in Java
Once we import the package, here is how we can create Scanner
objects.
// read input from the input stream
Scanner sc1 = new Scanner(InputStream input);
// read input from files
Scanner sc2 = new Scanner(File file);
// read input from a string
Scanner sc3 = new Scanner(String str);
Here, we have created objects of the Scanner
class that will read input from InputStream, File, and String respectively.
Java Scanner Methods to Take Input
The Scanner
class provides various methods that allow us to read inputs of different types.
Method | Description |
---|---|
nextInt() |
reads an int value from the user |
nextFloat() |
reads a float value form the user |
nextBoolean() |
reads a boolean value from the user |
nextLine() |
reads a line of text from the user |
next() |
reads a word from the user |
nextByte() |
reads a byte value from the user |
nextDouble() |
reads a doubl e value from the user |
nextShort() |
reads a short value from the user |
nextLong() |
reads a long value from the user |
Example 2: Java Scanner nextInt()
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// creates a Scanner object
Scanner input = new Scanner(System.in);
System.out.println("Enter an integer: ");
// reads an int value
int data1 = input.nextInt();
System.out.println("Using nextInt(): " + data1);
input.close();
}
}
Output
Enter an integer: 22 Using nextInt(): 22
In the above example, we have used the nextInt()
method to read an integer value.
Example 3: Java Scanner nextDouble()
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// creates an object of Scanner
Scanner input = new Scanner(System.in);
System.out.print("Enter Double value: ");
// reads the double value
double value = input.nextDouble();
System.out.println("Using nextDouble(): " + value);
input.close();
}
}
Output
Enter Double value: 33.33 Using nextDouble(): 33.33
In the above example, we have used the nextDouble()
method to read a floating-point value.
Example 4: Java Scanner next()
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// creates an object of Scanner
Scanner input = new Scanner(System.in);
System.out.print("Enter your name: ");
// reads the entire word
String value = input.next();
System.out.println("Using next(): " + value);
input.close();
}
}
Output
Enter your name: Jonny Walker Using next(): Jonny
In the above example, we have used the next()
method to read a string from the user.
Here, we have provided the full name. However, the next()
method only reads the first name.
This is because the next()
method reads input up to the whitespace character. Once the whitespace is encountered, it returns the string (excluding the whitespace).
Example 5: Java Scanner nextLine()
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// creates an object of Scanner
Scanner input = new Scanner(System.in);
System.out.print("Enter your name: ");
// reads the entire line
String value = input.nextLine();
System.out.println("Using nextLine(): " + value);
input.close();
}
}
Output
Enter your name: Jonny Walker Using nextLine(): Jonny Walker
In the first example, we have used the nextLine()
method to read a string from the user.
Unlike next()
, the nextLine()
method reads the entire line of input including spaces. The method is terminated when it encounters a next line character, n
.
Recommended Reading: Java Scanner skipping the nextLine().
Java Scanner with BigInteger and BigDecimal
Java scanner can also be used to read the big integer and big decimal numbers.
- nextBigInteger() — reads the big integer value from the user
- nextBigDecimal() — reads the big decimal value from the user
Example 4: Read BigInteger and BigDecimal
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// creates an object of Scanner
Scanner input = new Scanner(System.in);
System.out.print("Enter a big integer: ");
// reads the big integer
BigInteger value1 = input.nextBigInteger();
System.out.println("Using nextBigInteger(): " + value1);
System.out.print("Enter a big decimal: ");
// reads the big decimal
BigDecimal value2 = input.nextBigDecimal();
System.out.println("Using nextBigDecimal(): " + value2);
input.close();
}
}
Output
Enter a big integer: 987654321 Using nextBigInteger(): 987654321 Enter a big decimal: 9.55555 Using nextBigDecimal(): 9.55555
In the above example, we have used the java.math.BigInteger
and java.math.BigDecimal
package to read BigInteger
and BigDecimal
respectively.
Working of Java Scanner
The Scanner
class reads an entire line and divides the line into tokens. Tokens are small elements that have some meaning to the Java compiler. For example,
Suppose there is an input string:
He is 22
In this case, the scanner object will read the entire line and divides the string into tokens: «He«, «is» and «22«. The object then iterates over each token and reads each token using its different methods.
Note: By default, whitespace is used to divide tokens.