In Java I/O, character streams handle data in units of characters (char) rather than bytes. The Reader class serves as the abstract superclass for all character input streams, while Writer is its counterpart for output streams. This contrasts with byte streams like InputStream and OutputStream, which operate on raw byte data.
FileReader for Character Input
FileReader is a concrete implementation of Reader designed to read characters from files. The following example demonstrates reading an entire file character by character:
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class CharacterFileInput {
public static void main(String[] args) {
try (Reader fileInput = new FileReader("input_data.txt")) {
int charValue;
while ((charValue = fileInput.read()) != -1) {
System.out.print((char) charValue);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
When processing text files containing non-ASCII characters like Chinese, specify the character encoding to prevent display issues:
Reader fileInput = new FileReader("data.txt", StandardCharsets.UTF_8);
BufferedReader for Efficient Reading
BufferedReader enhances reading efficiency by buffering input, similar to BufferedInputStream but for character data. It provides convenient methods like readLine() for processing text line by line:
try (BufferedReader bufferedInput = new BufferedReader(
new FileReader("document.md"))) {
String textLine;
while ((textLine = bufferedInput.readLine()) != null) {
System.out.println(textLine);
}
} catch (IOException ex) {
ex.printStackTrace();
}
InputStreamReader for Stream Conversion
InputStreamReader acts as a bridge between byte streams and character streams. It converts bytes from an InputStream into characters using a specified charset:
try (InputStream byteStream = new FileInputStream("source.bin");
Reader charStream = new InputStreamReader(byteStream, "UTF-8")) {
// Process character data here
} catch (Exception ex) {
ex.printStackTrace();
}
Writer for Character Output
The Writer class provides character-oriented output functionality, essentially functioning as an OutputStream with built-in character encoding. Key comparisons include:
| Byte Stream (OutputStream) | Character Stream (Writer) |
|---|---|
| Operates on bytes | Operates on characters |
write(int b) for 0-255 |
write(int c) for 0-65535 |
write(byte[] b) |
write(char[] c) |
| No direct String support | write(String s) |
FileWriter Implementation
FileWriter writes character data to files, supporting various data types:
try (Writer fileOutput = new FileWriter("output.txt")) {
fileOutput.write('A'); // Single character
fileOutput.write("Text".toCharArray()); // Character array
fileOutput.write("String data"); // String directly
} catch (IOException ex) {
ex.printStackTrace();
}
OutputStreamWriter for Output Conversion
OutputStreamWriter converts character output to byte streams, enabling character data writing to any OutputStream:
try (Writer charOutput = new OutputStreamWriter(
new FileOutputStream("result.dat"))) {
charOutput.write("Character data to bytes");
} catch (IOException ex) {
ex.printStackTrace();
}