BufferedInputStream Class in Java

In this article, we'll look at the BufferedInputStream class, which provides buffered reads for input streams. 

1. Introduction to BufferedInputStream 

The BufferedInputStream class, a member of the java.io package, is an implementation of a filtered input stream that provides buffering capabilities for other input streams. Buffering can speed up I/O operations since it reduces the need to interact directly and frequently with the source of the data. 

2. How it Works 

By wrapping an existing input stream (like FileInputStream) with a BufferedInputStream, you can read data from the buffer instead of the original source. This buffer gets refilled automatically when it runs out of data, leading to fewer I/O operations and improved performance. 

3. Using BufferedInputStream 

Here's a simple example to read a file using BufferedInputStream:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamExample {

    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("sample.txt");
             BufferedInputStream bis = new BufferedInputStream(fis)) {
            
            int data;
            while ((data = bis.read()) != -1) {
                System.out.print((char) data);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

In the above code, we are reading from file sample.txt using BufferedInputStream, and its content is printed character by character. 

4. Key Points 

Performance Boost: The primary advantage of BufferedInputStream is performance. By reducing the number of I/O operations, applications can run faster, especially when dealing with large files or slow I/O sources. 

Flexibility with Buffer Size: By default, BufferedInputStream uses a buffer of 8KB. However, if needed, you can specify a different size during instantiation: new BufferedInputStream(fis, bufferSize)

Sequential Reads: BufferedInputStream is optimized for sequential reads. If you need random access to a file, consider using RandomAccessFile

5. When to Use BufferedInputStream?

Improved Byte Reading Efficiency: Choose BufferedInputStream for scenarios where you're reading byte data frequently, such as loading large files. With its internal buffering capability, BufferedInputStream reads larger chunks of data at once, reducing the number of I/O operations and enhancing performance compared to reading byte-by-byte. 

Adaptable Input Sources: BufferedInputStream can be wrapped around various input streams like FileInputStream or socket input streams. This adaptability ensures that your data source, irrespective of its origin, benefits from buffered reading, leading to swifter data retrieval. 

Mark and Reset Functionality: One of the distinguishing features of BufferedInputStream is the ability to mark a particular point in the stream and then reset back to it later. This is particularly useful when you need to reread a portion of the stream for specific parsing or processing tasks. 

As with other I/O classes, always close the BufferedInputStream after use to ensure system resources are released and any lingering buffered data is appropriately managed.

5. Conclusion

While BufferedInputStream introduces an extra layer between your code and the data source, the performance benefits usually outweigh the slight complexity overhead. For applications where I/O performance is crucial, using buffered streams like BufferedInputStream is a best practice worth adopting.

Related Java I/O Classes

Comments