Buffered Streams
Buffered Streams in Java improve I/O performance by reducing the number of direct interactions with the underlying file system or device. They wrap existing streams and use an in-memory buffer to read/write data in larger chunks instead of byte-by-byte or char-by-char.
This is a must-know Core Java I/O topic and a common interview question.
What Are Buffered Streams?
- Streams that use an internal buffer
- Reduce disk I/O operations
- Increase performance significantly
- Part of the java.io package
- Available for both byte and character streams
Why Buffered Streams Are Needed
Without Buffering
- Frequent disk access
- Slow performance
- High I/O overhead
With Buffering
- Fewer disk reads/writes
- Faster execution
- Efficient memory usage
Types of Buffered Streams
- 1️⃣ Buffered Byte Streams
- BufferedInputStream
- BufferedOutputStream
- 2️⃣ Buffered Character Streams
- BufferedReader
- BufferedWriter
Buffered Byte Streams
BufferedInputStream
Used to read binary data efficiently.
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("image.jpg"));
int data;
while ((data = bis.read()) != -1) {
// process byte
}
bis.close();
- ✔ Uses byte buffer
- ✔ Faster than FileInputStream
BufferedOutputStream
Used to write binary data efficiently.
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream("copy.jpg"));
bos.write(65);
bos.flush();
bos.close();
- ✔ Data written in chunks
- ✔ flush() forces buffer write
Buffered Character Streams
BufferedReader (Most Common)
Used to read text efficiently, supports line-by-line reading.
BufferedReader br =
new BufferedReader(new FileReader("data.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
- ✔ Very fast
- ✔ Supports readLine()
BufferedWriter
Used to write text efficiently.
BufferedWriter bw =
new BufferedWriter(new FileWriter("out.txt"));
bw.write("Hello Java");
bw.newLine();
bw.close();
- ✔ Efficient
- ✔ Platform-independent line separator
Buffered Streams Class Hierarchy
Byte Streams
InputStream
└── FilterInputStream
└── BufferedInputStream
OutputStream
└── FilterOutputStream
└── BufferedOutputStream
Character Streams
Reader
└── BufferedReader
Writer
└── BufferedWriter
How Buffering Works Internally
- Reads/writes blocks of data into memory
- Serves data from buffer instead of disk
- Disk accessed only when buffer is empty/full
Disk ↔ Buffer ↔ Program
Buffer Size
Default buffer size:
- 8 KB (8192 bytes/chars)
Custom buffer size:
new BufferedInputStream(new FileInputStream("a.bin"), 16384);
- ✔ Larger buffers → fewer I/O calls
- ⚠ Too large → memory waste
Buffered Streams vs Unbuffered Streams (Interview Table)
| Aspect | Buffered | Unbuffered |
|---|---|---|
| Performance | Fast | Slow |
| Memory | Uses buffer | Minimal |
| Disk I/O | Less | More |
| Recommended | ✔ Yes | ❌ No |
Buffered Streams vs Byte/Character Streams
- Buffered streams are wrappers, not standalone
- Work on top of existing streams
- Improve performance only
Common Beginner Mistakes
- Not using buffering for large files
- Forgetting flush() before close (output)
- Mixing byte and character streams incorrectly
- Using buffered streams for very small data unnecessarily
Best Practices (Production-Grade)
- Always use buffered streams for file I/O
- Use BufferedReader for text files
- Use BufferedInputStream for binary files
- Combine with try-with-resources
try (BufferedReader br =
new BufferedReader(new FileReader("a.txt"))) {
// read logic
}
Buffered Streams vs NIO (Modern Java)
- Buffered Streams → classic I/O
- NIO (Files, Channels) → faster, scalable
- Interviews expect buffered streams knowledge
Interview-Ready Answers
Short Answer
Buffered streams improve I/O performance by reducing disk access.
Detailed Answer
In Java, buffered streams wrap existing input or output streams and use an internal buffer to read or write data in chunks. This significantly improves performance by minimizing direct disk I/O operations and is applicable to both byte and character streams.
Key Takeaway
Buffered Streams = Performance Optimization for I/O. Always buffer file operations to achieve faster and more efficient input/output.