Text File I/O in Java Using Character Streams
Java provides character-stream classes in the java.io package to read and write text-based files. These classes are ideal for working with:
.txt.csv.json.xml.log
Below are the three main classes used for text file operations:

1. FileReader (Reading Text Files Character-by-Character)
FileReader is a character-input stream used to read text files one character at a time.
Key Features
-
Reads Unicode characters
- Best for small-size files
- Simple and easy to use
- Not optimized for large files
Example
import java.io.FileReader;
public class FileReaderExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("input.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. BufferedReader (Efficient Text Reading)
BufferedReader wraps a FileReader to provide fast and efficient reading using an internal buffer.
Key Features
-
Reads text line-by-line
- Much faster than FileReader
- Great for large files, logs, CSVs
Example
import java.io.BufferedReader;
import java.io.FileReader;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Important Methods
-
read()– reads a single character readLine()– reads entire lineclose()– closes the stream
3. FileWriter (Writing Text Files)
FileWriter is a character-output stream used to write data into text files.
Key Features
-
Writes text/characters
- Overwrites file by default
- Can append to existing file
Example
import java.io.FileWriter;
public class FileWriterExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello, Java!\\n");
fw.write("Writing using FileWriter.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Append Mode
FileWriter fw = new FileWriter("output.txt", true);
fw.write("\\nAppending new data...");
fw.close();
4. BufferedWriter (Optional but Important)
BufferedWriter wraps a FileWriter and writes text efficiently using buffering.
Why Use BufferedWriter?
-
Faster than FileWriter alone
- Supports
newLine()method - Ideal for writing large text files
Example
import java.io.BufferedWriter;
import java.io.FileWriter;
public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Hello World!");
bw.newLine();
bw.write("Writing using BufferedWriter.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. Full Example (Copy File using Character Streams)
import java.io.*;
public class CopyFile {
public static void main(String[] args) {
try (FileReader fr = new FileReader("source.txt");
FileWriter fw = new FileWriter("destination.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
When to Use What?
| Class | Best Used For | Speed | Notes |
|---|---|---|---|
| FileReader | Reading characters | Slow | Good for small files |
| BufferedReader | Reading lines, large files | Fast | Most preferred |
| FileWriter | Writing characters | Medium | Overwrites file |
| BufferedWriter | Efficient writing | Fast | Supports newLine() |
Points to Remember
- FileReader → Reads characters one-by-one
- BufferedReader → Reads text efficiently (best for large files)
- FileWriter → Writes characters to a file
- BufferedWriter → Writes text faster using a buffer
- Use try-with-resources for automatic closing
- Use append mode when you don't want to overwrite
