首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java I/O 系統基礎知識體系:流分類、裝飾器模式、核心類對照與實戰代碼

     編輯:Java 相關知識

流的本質抽象

  • 流:有序資料序列,屏蔽底層設備細節(源自 UNIX 管道)。
  • 方向:相對記憶體 —— 輸入流 (資料進記憶體)、輸出流 (資料出記憶體)。
  • 單位:位元組流 (byte) vs 字元流 (char/UTF-16 代碼單元)。

四大抽象基類 (java.io)

輸入輸出
位元組流InputStreamOutputStream
字元流ReaderWriter

所有具體流類繼承自這四個類。Reader/Writer (JDK 1.1+) 補充字元處理,介面與位元組流對稱。

兩大設計模式貫穿始終

1. 節點流 vs 過濾流 (裝飾器模式 Decorator Pattern)

  • 節點流:直接連接資料源/目的地 (檔案、記憶體、網路)。
  • 過濾流:包裝其他流,增加功能 (緩衝、轉碼、格式化、資料類型讀寫)。
  • 鐵律:幾乎不直接用節點流,而是層層包裝:new BufferedReader(new InputStreamReader(new FileInputStream(...)))。

2. 位元組 ↔ 字元橋接 (適配器模式 Adapter Pattern)

// 位元組 → 字元 (解碼)
InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");

// 字元 → 位元組 (編碼)
OutputStreamWriter osw = new OutputStreamWriter(outputStream, "UTF-8");

核心類完整對照表

功能/來源位元組流 (InputStream/OutputStream)字元流 (Reader/Writer)
檔案FileInputStream / FileOutputStreamFileReader / FileWriter
記憶體陣列ByteArrayInputStream / ByteArrayOutputStreamCharArrayReader / CharArrayWriter
字串—StringReader / StringWriter
管道 (執行緒間)PipedInputStream / PipedOutputStreamPipedReader / PipedWriter
緩衝BufferedInputStream / BufferedOutputStreamBufferedReader / BufferedWriter
資料類型讀寫DataInputStream / DataOutputStream— (用 DataInput/Output 配合流)
格式化輸出PrintStreamPrintWriter
行號追蹤LineNumberInputStreamLineNumberReader
推回輸入PushbackInputStreamPushbackReader
轉碼橋接InputStreamReader / OutputStreamWriter—
隨機存取RandomAccessFile (獨立實現 DataInput/DataOutput)—
物件序列化ObjectInputStream / ObjectOutputStream—

實戰代碼模板庫

1. 緩衝讀取檔案 (標準範式)

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();
    }
}

2. 從記憶體字串讀取

StringReader in = new StringReader(content);
int c;
while ((c = in.read()) != -1) System.out.print((char) c);

3. 格式化寫入檔案 (帶行號)

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);
}

4. 基本類型資料存儲與恢復 (DataInput/OutputStream)

// 寫入
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());
}

5. RandomAccessFile 隨機讀寫

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());
}

6. 物件序列化 (Serializable)

// 寫入
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 顯式聲明。

進階:NIO.2 現代化替代 (JDK 7+)

  • 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 版) 必須配對使用,一端寫入、一端讀取,實現執行緒間資料流動 (生產者-消費者)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved