Java I O Buffered Streams - RameshMF/java-io-guide GitHub Wiki

Buffered Streams Overview

In unbuffered I/O, each read or write request is handled directly by the underlying OS. This can make a program much less efficient, since each such request often triggers disk access, network activity, or some other operation that is relatively expensive.

To reduce this kind of overhead, the Java platform implements buffered I/O streams. Buffered input streams read data from a memory area known as a buffer; the native input API is called only when the buffer is empty. Similarly, buffered output streams write data to a buffer, and the native output API is called only when the buffer is full.

There are four buffered stream classes used to wrap unbuffered streams:

  • BufferedInputStream and BufferedOutputStream - create buffered byte streams
  • BufferedReader and BufferedWriter - create buffered character streams

Let's demonstrate Buffered Streams I/O classes with examples.

BufferedOutputStream Class

Java BufferedOutputStream class is used for buffering an output stream. It internally uses buffer to store data. It adds more efficiency than to write data directly into a stream. So, it makes the performance fast.

BufferedOutputStream Class Example

package com.javaguides.javaio.fileoperations.examples;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class BufferedOutputStreamExample {
	public static void main(String[] args) {
		File file = new File("C:/Project_Work/workspace/java-io-guide/sample.txt");
		String content = "This is the text content";

		try (OutputStream out = new FileOutputStream(file);
				BufferedOutputStream bout = new BufferedOutputStream(out);) {

			// if file doesn't exists, then create it
			if (!file.exists()) {
				file.createNewFile();
			}
			// get the content in bytes
			bout.write(content.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

BufferedInputStream Class

Java BufferedInputStream class is used to read information from stream. It internally uses buffer mechanism to make the performance fast.

The important points about BufferedInputStream are:

  • When the bytes from the stream are skipped or read, the internal buffer automatically refilled from the contained input stream, many bytes at a time.
  • When a BufferedInputStream is created, an internal buffer array is created.

BufferedInputStream Example

package com.javaguides.javaio.fileoperations.examples;

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

public class BufferedInputStreamExample {
	public static void main(String[] args) {
		try( FileInputStream fin=new FileInputStream("D:\\testout.txt");    
			    BufferedInputStream bin=new BufferedInputStream(fin); ){
			int i;    
		    while((i=bin.read())!=-1){    
		     System.out.print((char)i);    
		    }    
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

BufferedWriter Class

Java BufferedWriter class is used to provide buffering for Writer instances. It makes the performance fast. It inherits Writer class. The buffering characters are used for providing the efficient writing of single arrays, characters, and strings.

BufferedWriter Class Example

Let's see the simple example of writing the data to a text file testout.txt using Java BufferedWriter.

package com.javaguides.javaio.fileoperations.examples;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
	public static void main(String[] args) {
		try (FileWriter writer = new FileWriter("D:\\sample.txt");
				BufferedWriter buffer = new BufferedWriter(writer);) {
			buffer.write("Welcome to JavaGuides.");
			System.out.println("Success");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

BufferedReader Class

Java BufferedReader class is used to read the text from a character-based input stream. It can be used to read data line by line by readLine() method. It makes the performance fast. It inherits Reader class.

BufferedReader Class Example

package com.javaguides.javaio.fileoperations.examples;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
	public static void main(String[] args) {
		try (FileReader fr = new FileReader("C:/Project_Work/workspace/java-io-guide/sample.txt"); 
				BufferedReader br = new BufferedReader(fr);) {
			int i;
			while ((i = br.read()) != -1) {
				System.out.print((char) i);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}