← Back to Home

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. 1️⃣ Buffered Byte Streams
    • BufferedInputStream
    • BufferedOutputStream
  2. 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.