| 輸入 | 輸出 | |
|---|---|---|
| 位元組流 | InputStream | OutputStream |
| 字元流 | Reader | Writer |
所有具體流類繼承自這四個類。Reader/Writer (JDK 1.1+) 補充字元處理,介面與位元組流對稱。
new BufferedReader(new InputStreamReader(new FileInputStream(...)))。// 位元組 → 字元 (解碼)
InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");
// 字元 → 位元組 (編碼)
OutputStreamWriter osw = new OutputStreamWriter(outputStream, "UTF-8");
| 功能/來源 | 位元組流 (InputStream/OutputStream) | 字元流 (Reader/Writer) |
|---|---|---|
| 檔案 | FileInputStream / FileOutputStream | FileReader / FileWriter |
| 記憶體陣列 | ByteArrayInputStream / ByteArrayOutputStream | CharArrayReader / CharArrayWriter |
| 字串 | — | StringReader / StringWriter |
| 管道 (執行緒間) | PipedInputStream / PipedOutputStream | PipedReader / PipedWriter |
| 緩衝 | BufferedInputStream / BufferedOutputStream | BufferedReader / BufferedWriter |
| 資料類型讀寫 | DataInputStream / DataOutputStream | — (用 DataInput/Output 配合流) |
| 格式化輸出 | PrintStream | PrintWriter |
| 行號追蹤 | LineNumberInputStream | LineNumberReader |
| 推回輸入 | PushbackInputStream | PushbackReader |
| 轉碼橋接 | InputStreamReader / OutputStreamWriter | — |
| 隨機存取 | RandomAccessFile (獨立實現 DataInput/DataOutput) | — |
| 物件序列化 | ObjectInputStream / ObjectOutputStream | — |
public static String readFile(String filename) throws IOException {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream(filename), StandardCharsets.UTF_8))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = in.readLine()) != null) sb.append(line).append('\n');
return sb.toString();
}
}
StringReader in = new StringReader(content);
int c;
while ((c = in.read()) != -1) System.out.print((char) c);
try (PrintWriter out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("out.txt"), StandardCharsets.UTF_8)))) {
int lineNo = 1;
String line;
while ((line = in.readLine()) != null) out.println(lineNo++ + ": " + line);
}
// 寫入
try (DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream("data.dat")))) {
out.writeUTF("hello");
out.writeDouble(1.23);
out.writeInt(42);
}
// 讀取 (順序必須一致)
try (DataInputStream in = new DataInputStream(
new BufferedInputStream(new FileInputStream("data.dat")))) {
System.out.println(in.readUTF());
System.out.println(in.readDouble());
System.out.println(in.readInt());
}
try (RandomAccessFile rf = new RandomAccessFile("data.dat", "rw")) {
for (int i = 0; i < 7; i++) rf.writeDouble(i * 1.414);
rf.writeUTF("End");
rf.seek(5 * 8); // 跳到第 6 個 double
rf.writeDouble(42.0001); // 修改
rf.seek(0);
for (int i = 0; i < 7; i++) System.out.println(rf.readDouble());
System.out.println(rf.readUTF());
}
// 寫入
try (ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("obj.dat")))) {
oos.writeObject(user);
}
// 讀取
try (ObjectInputStream ois = new ObjectInputStream(
new BufferedInputStream(new FileInputStream("obj.dat")))) {
User u = (User) ois.readObject();
}
注意:實作 Serializable,敏感欄位 transient,serialVersionUID 顯式聲明。
Files.readAllLines(Path, Charset) / Files.write(Path, Iterable<String>, Charset, OpenOption...)Files.newBufferedReader(Path, Charset) / Files.newBufferedWriter(...)FileChannel + MappedByteBuffer:大檔案記憶體映射,隨機存取極快。AsynchronousFileChannel:真正非同步 I/O (AIO)。PipedInputStream/PipedOutputStream (或 Reader/Writer 版) 必須配對使用,一端寫入、一端讀取,實現執行緒間資料流動 (生產者-消費者)。