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,
1 2 3 4 | 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,
1 2 3 4 | Have a nice day |
Now, let us see how to override the default delimiter during the scanning process using the following code,
1 2 3 4 5 | 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,
1 2 | 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,
1 2 3 4 | 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,
1 2 3 4 5 6 | 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,
1 2 3 | 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,
1 | 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.
1 2 3 4 5 | Scanner scanner = new Scanner(
new FileInputStream("someFile.txt"));
Scanner scanner = new Scanner(
new File("anotherFile.txt")); |






September 25, 2007
Java