A Scanner object can be used to read text input from a number of sources. The input source can be a file, an input stream or even from a string. It internally uses the Regular Expression Api for parsing and getting the input. Let us see a simple example to parse a String object,
also read:
- Java Tutorials
- Java EE Tutorials
- Design Patterns Tutorials
- Java File IO Tutorials
Scanner scanner = new Scanner('Have a nice day'); while (scanner.hasNext()){ System.out.println(scanner.next()); }
In the above example, we have used the java.util.Scanner
class for parsing the input from the String ‘Have a nice day’. Note that the default delimiter that the Scanner will use during parsing is white-space. If you run the above program, you will see the following output in your console,
Have a nice day
Now, let us see how to override the default delimiter during the scanning process using the following code,
Scanner scanner = new Scanner('Once upon a time, there lived a king'); scanner.useDelimiter(','); while (scanner.hasNext()){ System.out.println(scanner.next()); }
In the above code snippet, we have explicitly specified comma as the delimiter by calling the Scanner.useDelimter()
method before the scanning process. The output in this case is,
Once upon a time there lived a king
The above examples assumed that the input will be always a text, however that wont be the case always, because of which we have method variants in the Scanner class that will operate on different data-types like integer, float, Boolean, byte, float etc. Consider the following code snippet which will illustrate that,
Scanner scanner = new Scanner('1 3 5 7 9 11 13'); while (scanner.hasNextInt()){ System.out.println(scanner.nextInt()); }
Note the use of Scanner.hasNextInt()
and Scanner.nextInt()
for parsing input with integer content. Similarly we have hasNextLong()/nextLong()
, hasNextBoolean()/nextBoolean()
, hasNextByte()/nextByte()
for long, boolean and byte data-types respectively. It is also possible to parse a mixture of different data-types. For example, consider the following code snippet,
Scanner scanner = new Scanner('Hello 1 3.6 123456789000 true'); System.out.println(scanner.hasNext() == true ? scanner.next() : ''); System.out.println(scanner.hasNextInt() == true ? scanner.nextInt() : ''); System.out.println(scanner.hasNextDouble() == true ? scanner.nextDouble() : ''); System.out.println(scanner.hasNextLong() == true ? scanner.nextLong() : ''); System.out.println(scanner.hasNextBoolean() == true ? scanner.nextBoolean() : '');
The output of the above code is,
Hello 1 3.6
It is always advisable to check for the existence of the value with the correct data-type by calling the Scanner.hasNextXXX()
methods before trying to get the value using Scanner.nextXXX()
methods. If any mismatch is found, then InputMismatchException
will be thrown at the run-time.
Scanner class has a close()
method which should be called after being done with the various operations like this,
scanner.close();
It is illegal to call any of the operations after closing the Scanner object and such calls will result in throwing IllegalStateException
. As mentioned earlier, the input source for a Scanner object can originate not only from a String but also from a File or from an Input Stream. So, the following statements are valid too.
Scanner scanner = new Scanner( new FileInputStream('someFile.txt')); Scanner scanner = new Scanner( new File('anotherFile.txt'));