BufferedReader vs Scanner in Java: A Comprehensive Comparison
When it comes to reading input in Java, especially from files or user input, two commonly used classes are BufferedReader
and Scanner
. Both serve the purpose of reading text, but they differ in performance, flexibility, and use cases. Understanding the strengths and weaknesses of each will help you choose the right one depending on your requirements.
1. Introduction
Java offers multiple ways to read input:
-
From the console
-
From files
-
From network sockets
-
From strings
Two of the most frequently used classes for input are:
-
java.io.BufferedReader
-
java.util.Scanner
Both are widely used in Java applications, but they operate differently and are optimized for different scenarios.
2. BufferedReader: Overview
Definition
BufferedReader
is a character stream class used to read text from a character-based input stream. It buffers characters for efficient reading of characters, arrays, and lines.
Constructor
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Key Methods
-
readLine()
– reads a line of text. -
read()
– reads a single character. -
read(char[] cbuf, int off, int len)
– reads characters into a portion of an array.
Use Case When you want fast reading of characters or lines, particularly from large files.
Example
import java.io.*;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
System.out.print("Enter your name: ");
String name = br.readLine();
System.out.println("Hello, " + name + "!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Scanner: Overview
Definition
Scanner
is a utility class used to parse primitive types and strings using regular expressions. It’s part of the java.util
package and is more user-friendly when parsing input.
Constructor
Scanner scanner = new Scanner(System.in);
Key Methods
-
nextLine()
– reads an entire line. -
next()
– reads the next token. -
nextInt()
,nextDouble()
,nextBoolean()
– reads respective types.
Use Case When you need to read and parse formatted input (e.g., integers, floats, strings).
Example
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter your age: ");
int age = sc.nextInt();
System.out.println("You are " + age + " years old.");
}
}
4. Key Differences Between BufferedReader and Scanner
Feature | BufferedReader | Scanner |
---|---|---|
Package | java.io |
java.util |
Performance | Faster (uses buffer) | Slower (due to regex parsing) |
Parsing Support | No built-in parsing | Built-in support for parsing primitives |
Reads | Characters, lines | Tokens, lines, and primitive types |
Buffering | Yes | No (relies on stream itself) |
Input Source | Character streams | InputStream, File, String |
Regular Expression Support | No | Yes |
5. Performance Consideration
BufferedReader
is significantly faster when reading large files or long strings of data because it minimizes the number of I/O operations by reading larger chunks into a buffer.
Scanner
is more convenient for parsing input, especially from users, but it incurs a performance hit due to regex parsing.
6. Reading From Files: BufferedReader vs Scanner
BufferedReader
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
Scanner
Scanner sc = new Scanner(new File("data.txt"));
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
sc.close();
7. Limitations
BufferedReader
-
Only reads text as strings.
-
Requires manual parsing of data types.
-
Must handle IOException explicitly.
Scanner
-
Can be slow for large data files.
-
Throws
InputMismatchException
for incorrect data formats. -
May leave newline characters unread when mixing
next()
andnextLine()
.
8. When to Use What?
Scenario | Recommended Class |
---|---|
Reading large text files | BufferedReader |
Parsing formatted input (e.g., CSV) | Scanner |
Fast line-by-line reading | BufferedReader |
Accepting mixed-type console input | Scanner |
Simpler syntax and built-in parsing | Scanner |
Need for high-performance file reading | BufferedReader |
9. Combining Both
You can combine the best of both worlds by using BufferedReader
for performance and doing your own parsing:
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(",");
int id = Integer.parseInt(parts[0]);
String name = parts[1];
System.out.println(id + ": " + name);
}
br.close();
10. Conclusion
Both BufferedReader
and Scanner
are powerful tools for reading input in Java. Your choice should be guided by the specific needs of your application:
-
Use
BufferedReader
for performance-heavy applications like reading large files. -
Use
Scanner
for quick and easy parsing of input, especially from the user.
Understanding their differences helps you write more efficient and maintainable Java code.
Sign up here with your email
ConversionConversion EmoticonEmoticon