| 維度 | 分類 | 基礎類 | 說明 |
|---|---|---|---|
| 數據單位 | 字節流 | InputStream / OutputStream | 以 8-bit 字節為單位,處理圖片、視頻、二進制數據 |
| 字符流 | Reader / Writer | 以 16-bit Unicode 字符為單位,處理文本,自動處理編碼轉換 | |
| 角色 | 節點流 | FileInputStream 等 | 直接連接數據源/目的地(文件、記憶體、網絡) |
| 過濾流 | BufferedInputStream 等 | 包裝其他流,提供緩衝、轉換、數據類型化等增強功能 |
int read()、int read(byte[] b)、int read(byte[] b, int off, int len)long skip(long n)、int available()void mark(int readlimit)、void reset()、boolean markSupported()void close()void write(int b)、void write(byte[] b)、void write(byte[] b, int off, int len)void flush()、void close()Reader/Writer 方法簽名與字節流對應,參數類型為 char[] 或 String。
典型鏈路:FileInputStream → BufferedInputStream → DataInputStream
readInt()、readUTF() 等類型化讀取。// 字節複製
try (FileInputStream in = new FileInputStream("src.txt");
FileOutputStream out = new FileOutputStream("dest.txt")) {
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}
// 字符複製(自動編碼)
try (FileReader in = new FileReader("src.txt");
FileWriter out = new FileWriter("dest.txt")) {
char[] buf = new char[4096];
int len;
while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}
BufferedInputStream/OutputStream:字節緩衝,構造可指定緩衝區大小(預設 8KB)。BufferedReader/Writer:字符緩衝,提供 readLine()、newLine() 便利方法。flush() 強制寫出,close() 會自動 flush。// 生產者線程
PipedOutputStream pos = new PipedOutputStream();
new Thread(() -> {
try (PrintWriter pw = new PrintWriter(pos)) {
for (int i=0;i<10;i++) pw.println("msg-"+i);
} catch (IOException e) { e.printStackTrace(); }
}).start();
// 消費者線程
PipedInputStream pis = new PipedInputStream(pos);
try (BufferedReader br = new BufferedReader(new InputStreamReader(pis))) {
String line;
while ((line = br.readLine()) != null) System.out.println("收到:" + line);
}
也可先建立兩端再 connect()。管道流實現記憶體級零拷貝傳輸,適合生產者-消費者模式。
流程:文件讀取 → 逆序線程 → 排序線程 → 逆序還原 → 控制台輸出
Reader source = new FileReader("words.txt");
Reader piped1 = reverse(source); // 線程1:每行逆序
Reader piped2 = sort(piped1); // 線程2:全量排序
Reader finalReader = reverse(piped2); // 線程3:再次逆序還原
new BufferedReader(finalReader).lines().forEach(System.out::println);
每個處理階段運行在獨立線程,透過 PipedReader/Writer 串聯,展示流套接與多線程管道協作的強大表達力。
try-with-resources 確保資源釋放。InputStreamReader/OutputStreamWriter 是字節與字符世界的橋樑,必須顯式指定 Charset 避免平台預設編碼差異。