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

Java I/O 流完整教學:從 InputStream 到 Object 序列化

     編輯:Java 相關知識

輸入流體系

InputStream(抽象基類)

  • read():單位元組讀取,回傳 int(-1 表結束)
  • read(byte[])、read(byte[], off, len):批次讀取
  • skip(long):跳過位元組
  • available():可讀位元組數
  • close():關閉釋放資源

主要子類別

類別用途
ByteArrayInputStream從位元組陣列讀取
FileInputStream從檔案讀取,含 getFD() 取得 FileDescriptor
FilterInputStream裝飾者基類,支援巢狀包裝
BufferedInputStream緩衝讀取,提升效能,支援 mark/reset
DataInputStream讀取基本型別(readInt、readUTF 等),實作 DataInput
LineNumberInputStream追蹤行號
PushbackInputStream可將讀取的位元組推回 (unread())
PipedInputStream執行緒間管道通訊(配合 PipedOutputStream)
SequenceInputStream串聯多個輸入流

輸出流體系

OutputStream(抽象基類)

  • write(int)、write(byte[])、write(byte[], off, len)
  • flush()、close()

主要子類別

類別用途
ByteArrayOutputStream寫入記憶體陣列,toByteArray()、toString()
FileOutputStream寫入檔案,支援 append 模式
BufferedOutputStream緩衝寫入,需手動 flush
DataOutputStream寫入基本型別,實作 DataOutput
PrintStream含 println(),自動處理換行與編碼
PipedOutputStream配合 PipedInputStream 實現執行緒管道

物件序列化


// 序列化寫出
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tmp"))) {
    oos.writeObject("Today");
    oos.writeObject(new Date());
}

// 反序列化讀回
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("tmp"))) {
    String s = (String) ois.readObject();
    Date d = (Date) ois.readObject();
}

transient 欄位不會被序列化;static 欄位也不屬於物件狀態。

管道通訊範例


PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
// 執行緒 A 寫 out,執行緒 B 讀 in

最佳實務

  1. 善用 try-with-resources 自動關閉流
  2. 大量讀寫務必使用 Buffered 包裝
  3. 文字處理優先用 Reader/Writer 字元流
  4. 序列化類別宣告 serialVersionUID
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved