| 維度 | 字節流 | 字符流 |
|---|---|---|
| 基類 | InputStream / OutputStream | Reader / Writer |
| 處理單位 | 字節 | Unicode 字符 |
| 典型實現 | FileInputStream, ByteArrayInputStream, PipedInputStream | FileReader, CharArrayReader, StringReader |
| 適用場景 | 二進制數據、圖片、網絡傳輸 | 文本文件、控制台交互 |
橋梁:InputStreamReader / OutputStreamWriter 實現字節↔字符轉換,支持指定編碼(如 UTF-8)。
Java IO 通過 FilterInputStream/FilterOutputStream 及 FilterReader/FilterWriter 子類,動態組合功能:
// 寫入文件:緩衝 + 格式化輸出
PrintWriter out = new PrintWriter(
new BufferedWriter(
new FileWriter("test.txt")));
out.println("Line 1");
out.printf("Value: %d", 42);
out.close();
每一層包裝賦予新能力,靈活組合,避免類爆炸。
| 功能 | 字節流 | 字符流 |
|---|---|---|
| 緩衝 | BufferedInputStream / BufferedOutputStream | BufferedReader / BufferedWriter |
| 基本類型讀寫 | DataInputStream / DataOutputStream | (無對應,用 DataInputStream + Reader) |
| 行號追蹤 | LineNumberInputStream | LineNumberReader |
| 回退 | PushbackInputStream | PushbackReader |
| 格式化輸出 | PrintStream | PrintWriter |
r(只讀)、rw(讀寫)、rws/rwd(同步)seek(long pos) 定位文件指針// 1. 行讀取文件 + 控制台交互
BufferedReader in = new BufferedReader(new FileReader("src/TestIO.java"));
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
// 2. 字符流操作 String
StringReader sr = new StringReader(content);
int c; while ((c = sr.read()) != -1) System.out.print((char)c);
// 3. 格式化寫入文件(帶行號)
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("out.txt")));
int line = 1;
String s; while ((s = in.readLine()) != null) pw.println(line++ + ": " + s);
// 4. 基本類型持久化
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream("data.dat")));
dos.writeDouble(3.14159);
dos.writeUTF("PI value");
// 5. RandomAccessFile 修改特定位置
RandomAccessFile raf = new RandomAccessFile("rtest.dat", "rw");
raf.seek(5 * 8); // 定位第 6 個 double
raf.writeDouble(47.0001);