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

Java IO 體系全景解析:流模型、裝飾者模式與實戰應用

     編輯:Java 相關知識

一、流的兩大維度分類

1. 按處理單位:字節流 vs 字符流

維度字節流字符流
基類InputStream / OutputStreamReader / Writer
處理單位字節Unicode 字符
典型實現FileInputStream, ByteArrayInputStream, PipedInputStreamFileReader, CharArrayReader, StringReader
適用場景二進制數據、圖片、網絡傳輸文本文件、控制台交互

橋梁:InputStreamReader / OutputStreamWriter 實現字節↔字符轉換,支持指定編碼(如 UTF-8)。

2. 按功能角色:節點流 vs 處理流

  • 節點流:直接連接數據源/目的地(文件、內存、管道、網絡)
  • 處理流:包裝節點流或其他處理流,提供緩衝、格式化、數據類型轉換等增強功能

二、裝飾者模式在 IO 中的經典應用

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 / BufferedOutputStreamBufferedReader / BufferedWriter
基本類型讀寫DataInputStream / DataOutputStream(無對應,用 DataInputStream + Reader)
行號追蹤LineNumberInputStreamLineNumberReader
回退PushbackInputStreamPushbackReader
格式化輸出PrintStreamPrintWriter

四、RandomAccessFile:隨機訪問特種兵

  • 模式: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);

六、關鍵最佳實踐

  1. 資源管理:JDK 7+ 必須使用 try-with-resources 自動關閉流
  2. 編碼顯式化:構造 Reader/Writer 時指定 Charset,避免平台默認編碼差異
  3. 緩衝必加:文件/網絡 IO 幾乎總是需要 Buffered 包裝
  4. 區分場景:文本用字符流,二進制用字節流,混合場景用轉換流
  5. 大文件處理:考慮 NIO (Channel/Buffer) 或內存映射文件提升性能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved