Parsing Input using Scanner

SHARE & COMMENT :

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:

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'));

Comments

comments

About Krishna Srinivasan

He is Founder and Chief Editor of JavaBeat. He has more than 8+ years of experience on developing Web applications. He writes about Spring, DOJO, JSF, Hibernate and many other emerging technologies in this blog.

Speak Your Mind

*

Close
Please support the site
By clicking any of these buttons you help our site to get better