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
[code lang=”java”]
Scanner scanner = new Scanner(‘Have a nice day’);
while (scanner.hasNext()){
System.out.println(scanner.next());
}
[/code]
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,
[code]
Have
a
nice
day
[/code]
Now, let us see how to override the default delimiter during the scanning process using the following code,
[code lang=”java”]
Scanner scanner = new Scanner(‘Once upon a time, there lived a king’);
scanner.useDelimiter(‘,’);
while (scanner.hasNext()){
System.out.println(scanner.next());
}
[/code]
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,
[code]
Once upon a time
there lived a king
[/code]
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,
[code lang=”java”]
Scanner scanner = new Scanner(‘1 3 5 7 9 11 13’);
while (scanner.hasNextInt()){
System.out.println(scanner.nextInt());
}
[/code]
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,
[code lang=”java”]
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() : ”);
[/code]
The output of the above code is,
[code]
Hello
1
3.6
[/code]
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,
[code lang=”java”]
scanner.close();
[/code]
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.
[code lang=”java”]
Scanner scanner = new Scanner(
new FileInputStream(‘someFile.txt’));
Scanner scanner = new Scanner(
new File(‘anotherFile.txt’));
[/code]
Leave a Reply