← Back to Core Java Course | Chapter 12: File I/O | Lesson 6 of 9

Java BufferedReader & BufferedWriter

BufferedWriter and BufferedReader are faster ways to write and read lines of text in files, like using a bucket instead of a spoon. They collect data before moving it.
Syntax
java
try (BufferedReader reader = new BufferedReader(new FileReader("file_name"))) {
    String line = reader.readLine();
}

Writing Lines with BufferedWriter

BufferedWriter wraps another writer (like FileWriter) and batches output in memory, flushing to disk in larger chunks instead of on every single write call — this is significantly faster for writing many lines.

Example: Writing Lines with BufferedWriter

java
// Import java.io.FileWriter so it can be used by its short name
import java.io.FileWriter;
// Import java.io.BufferedWriter so it can be used by its short name
import java.io.BufferedWriter;
import java.io.IOException;
// Define the class Main
public class Main {
	// Program entry point: the JVM starts running here
	public static void main(String[] args) throws IOException {
		// Create a new BufferedWriter object and store it in writer
		BufferedWriter writer = new BufferedWriter(new FileWriter("notes.txt"));
		writer.write("Line one");
		writer.newLine();
		writer.write("Line two");
		writer.close();
		// Print a line to the console
		System.out.println("Written");
	}
}

Reading Lines with BufferedReader

BufferedReader wraps another reader and adds readLine(), which returns a full line of text at once (or null at end-of-file) — far more convenient than reading one character at a time.

Example: Reading Lines with BufferedReader

java
// Import java.io.FileWriter so it can be used by its short name
import java.io.FileWriter;
// Import java.io.BufferedReader so it can be used by its short name
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
// Define the class Main
public class Main {
	// Program entry point: the JVM starts running here
	public static void main(String[] args) throws IOException {
		// Create a new FileWriter object and store it in writer
		FileWriter writer = new FileWriter("notes.txt");
		writer.write("Hello\nWorld");
		writer.close();
		// Create a new BufferedReader object and store it in reader
		BufferedReader reader = new BufferedReader(new FileReader("notes.txt"));
		String line;
		// Repeat while (line = reader.readLine()) != null is true
		while ((line = reader.readLine()) != null) {
			// Print a line to the console
			System.out.println(line);
		}
		reader.close();
	}
}

Flushing Buffered Streams

Buffered streams don't write to disk immediately; calling flush() forces any buffered data out now, and closing the stream flushes automatically, so unflushed data is only truly lost if the program crashes before closing.

Example: Flushing Buffered Streams

java
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedWriter writer = new BufferedWriter(new FileWriter("notes.txt"));
		writer.write("Buffered data");
		writer.flush(); // forces it out now
		writer.close();
		System.out.println("Flushed and closed");
	}
}

Exception Handling

File I/O can throw checked IOExceptions at almost any point — a missing file, a full disk, a permissions error — so buffered reads and writes need the same try-catch or try-with-resources discipline as unbuffered ones.

Example: Exception Handling

java
// Import java.io.BufferedReader so it can be used by its short name
import java.io.BufferedReader;
// Import java.io.FileReader so it can be used by its short name
import java.io.FileReader;
import java.io.IOException;
// Define the class Main
public class Main {
	// Program entry point: the JVM starts running here
	public static void main(String[] args) {
		// Try code that might throw an exception
		try (BufferedReader reader = new BufferedReader(new FileReader("missing.txt"))) {
			// Print a line to the console
			System.out.println(reader.readLine());
		// Handle IOException if it was thrown
		} catch (IOException e) {
			// Print a line to the console
			System.out.println("Caught: " + e.getClass().getSimpleName());
		}
	}
}

Data Aggregation

Reading a whole file line-by-line into a List<String> or building a running total from numeric lines are typical uses for BufferedReader, since readLine() naturally breaks input into processable chunks.

Example: Data Aggregation

java
// Import java.io.FileWriter so it can be used by its short name
import java.io.FileWriter;
// Import java.io.BufferedReader so it can be used by its short name
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
// Define the class Main
public class Main {
	// Program entry point: the JVM starts running here
	public static void main(String[] args) throws IOException {
		// Create a new FileWriter object and store it in writer
		FileWriter writer = new FileWriter("numbers.txt");
		writer.write("10\n20\n30");
		writer.close();
		// Create a new BufferedReader object and store it in reader
		BufferedReader reader = new BufferedReader(new FileReader("numbers.txt"));
		// Declare total and set it to 0
		int total = 0;
		String line;
		// Repeat while (line = reader.readLine()) != null is true
		while ((line = reader.readLine()) != null) {
			total += Integer.parseInt(line);
		}
		reader.close();
		System.out.println(total);
	}
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
Common Mistakes
  1. Forgetting to call flush() or close() on a BufferedWriter, so text is lost.
  2. Forgetting that readLine() returns null at the end of the file.
  3. Forgetting newLine() and joining lines together.

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.