Mastering the Scanner Class in Java: From Basics to Advanced Usage

Muhammad AmjadMuhammad Amjad
5 min read

The Scanner class in Java is one of the most versatile and widely used tools for handling user input. Whether you're building a simple console application or a complex program that requires user interaction, the Scanner class makes it easy to read and process input from various sources. In this blog, we'll explore the Scanner class in detail, starting from the basics and moving on to advanced usage.


1. Introduction to the Scanner Class

The Scanner class is part of the java.util package and is used to parse primitive types and strings using regular expressions. It can read input from various sources, such as:

  • The keyboard (System.in)

  • Files

  • Strings

  • Input streams

The Scanner class is particularly popular for its simplicity and flexibility, making it a go-to choice for handling user input in Java applications.


2. Setting Up the Scanner Class

To use the Scanner class, you first need to import it from the java.util package. Then, you can create a Scanner object to read input from a specific source.

Example: Basic Setup

import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        // Create a Scanner object to read input from the keyboard
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter your name: ");
        String name = scanner.nextLine(); // Read a string input

        System.out.println("Hello, " + name + "!");

        // Close the scanner to free resources
        scanner.close();
    }
}

Key Points:

  • The Scanner object is created using new Scanner(System.in) to read input from the keyboard.

  • Always close the Scanner object using the close() method to release system resources.


3. Reading Different Types of Input

The Scanner class provides various methods to read different types of input, such as integers, doubles, and strings. Here are some commonly used methods:

MethodDescription
next()Reads a single word (token) as a String.
nextLine()Reads an entire line of text as a String.
nextInt()Reads an int value.
nextDouble()Reads a double value.
nextBoolean()Reads a boolean value (true or false).
nextLong()Reads a long value.
nextFloat()Reads a float value.

Example: Reading Different Types of Input

import java.util.Scanner;

public class ScannerTypesExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter your name: ");
        String name = scanner.nextLine(); // Read a string

        System.out.print("Enter your age: ");
        int age = scanner.nextInt(); // Read an integer

        System.out.print("Enter your height (in meters): ");
        double height = scanner.nextDouble(); // Read a double

        System.out.print("Are you a student? (true/false): ");
        boolean isStudent = scanner.nextBoolean(); // Read a boolean

        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("Height: " + height + "m");
        System.out.println("Student: " + isStudent);

        scanner.close();
    }
}

Key Points:

  • Use the appropriate method based on the type of input you expect.

  • Be cautious when mixing nextLine() with other methods, as it can lead to unexpected behavior (explained later).


4. Handling Input Errors and Exceptions

When working with user input, it's essential to handle errors and exceptions gracefully. For example, if the user enters a string when an integer is expected, the program will throw an InputMismatchException.

Example: Handling Input Errors

import java.util.InputMismatchException;
import java.util.Scanner;

public class ScannerExceptionExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.print("Enter your age: ");
            int age = scanner.nextInt(); // This will throw an exception if input is not an integer
            System.out.println("Your age is: " + age);
        } catch (InputMismatchException e) {
            System.out.println("Invalid input. Please enter a valid integer.");
        } finally {
            scanner.close();
        }
    }
}

Key Points:

  • Use try-catch blocks to handle exceptions like InputMismatchException.

  • Always close the Scanner object in the finally block to ensure resources are released.


5. Advanced Features of the Scanner Class

The Scanner class offers several advanced features that can enhance its functionality. Let's explore some of them.

a. Using Delimiters

By default, the Scanner class uses whitespace as a delimiter to separate tokens. However, you can customize the delimiter using the useDelimiter() method.

Example: Custom Delimiter

import java.util.Scanner;

public class ScannerDelimiterExample {
    public static void main(String[] args) {
        String input = "John,Doe,25,5.9";
        Scanner scanner = new Scanner(input).useDelimiter(",");

        String firstName = scanner.next();
        String lastName = scanner.next();
        int age = scanner.nextInt();
        double height = scanner.nextDouble();

        System.out.println("First Name: " + firstName);
        System.out.println("Last Name: " + lastName);
        System.out.println("Age: " + age);
        System.out.println("Height: " + height + "m");

        scanner.close();
    }
}

b. Reading from Files

The Scanner class can also read input from files. This is useful for processing large datasets or configuration files.

Example: Reading from a File

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ScannerFileExample {
    public static void main(String[] args) {
        try {
            File file = new File("input.txt");
            Scanner scanner = new Scanner(file);

            while (scanner.hasNextLine()) {
                System.out.println(scanner.nextLine());
            }

            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("File not found.");
        }
    }
}

c. Using Regular Expressions

The Scanner class supports regular expressions for advanced pattern matching.

Example: Using Regular Expressions

import java.util.Scanner;

public class ScannerRegexExample {
    public static void main(String[] args) {
        String input = "The price is $19.99 and the discount is 10%.";
        Scanner scanner = new Scanner(input);

        // Find and print all numbers in the input
        while (scanner.hasNext()) {
            if (scanner.hasNextDouble()) {
                System.out.println("Number: " + scanner.nextDouble());
            } else {
                scanner.next();
            }
        }

        scanner.close();
    }
}

6. Best Practices for Using Scanner

  1. Close the Scanner Object: Always close the Scanner object using the close() method to free system resources.

  2. Handle Exceptions: Use try-catch blocks to handle exceptions like InputMismatchException.

  3. Avoid Mixing nextLine() with Other Methods: Mixing nextLine() with methods like nextInt() can cause unexpected behavior. Use nextLine() after nextInt() to consume the newline character.

  4. Validate Input: Always validate user input to ensure it meets the expected format and range.

  5. Use Delimiters Wisely: Customize delimiters when working with structured input (e.g., CSV files).


7. Conclusion

The Scanner class is a powerful and flexible tool for handling input in Java. Whether you're reading from the keyboard, a file, or a string, the Scanner class provides a wide range of methods to make input processing easy and efficient. By mastering its features and following best practices, you can build robust and user-friendly Java applications.

If you found this blog helpful, feel free to share it on your HashNode profile and connect with me for more programming insights. Happy coding!

0
Subscribe to my newsletter

Read articles from Muhammad Amjad directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Muhammad Amjad
Muhammad Amjad