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

Java IO 流體系全面總結:從基礎概念到核心類庫深度解析

     編輯:Java 綜合教學

Java IO 流體系全面總結:從基礎概念到核心類庫深度解析

一、什麼是 IO 流?

Java 中的 I/O 操作本質上是基於「數據流」進行輸入輸出的機制。數據流代表字符或字節序列的流動,java.io 包提供了讀寫數據的標準 API。無論是文件、網絡還是內存,只要表示數據源的對象,都能以流的形式讀寫。

Java IO 模型採用 裝飾者模式,按功能劃分 Stream,可動態組合裝配。例如需要緩衝的文件輸入流,組合 FileInputStream 和 BufferedInputStream 即可。JDK 1.4 引入 java.nio(New IO),基於通道與緩衝區,大幅提升高併發場景下的 IO 效率。

二、數據流核心概念

數據流如水管中的水流,連接「數據源」(外存、內存、緩存)與「程序」。

  • 輸入流:程序從外部(鍵盤、文件、網絡)讀取數據的通道。
  • 輸出流:程序向外部(顯示器、打印機、文件、網絡)寫入數據的通道。

流的設計使輸入輸出與具體設備解耦,InputStream 不關心數據源設備,OutputStream 不關心目標設備。

三、流的分類體系

1. 按數據單元分類

  • 字節流:最小單元為字節(8 bit),對應 InputStream/OutputStream 體系。
  • 字符流:最小單元為字符(Unicode,16 bit/2 字節),對應 Reader/Writer 體系,自動處理編碼轉換。

2. 按功能角色分類

  • 節點流:直接操作目標設備(如 FileInputStream、FileReader)。
  • 處理流/包裝流:包裝節點流,提供額外功能(如 BufferedInputStream、InputStreamReader)。

3. 按數據來源/去向分類

來源類型字節流字符流
文件FileInputStream / FileOutputStreamFileReader / FileWriter
內存數組ByteArrayInputStream / ByteArrayOutputStreamCharArrayReader / CharArrayWriter
字符串StringBufferInputStreamStringReader / StringWriter
管道(進程間通信)PipedInputStream / PipedOutputStreamPipedReader / PipedWriter

四、核心抽象類與關鍵類

java.io 核心由 5 個類 + 1 個接口構成:

  • File:文件/目錄元數據管理(非數據流操作)。
  • InputStream:字節輸入流父類,核心方法 read()、read(byte[])、close()。
  • OutputStream:字節輸出流父類,核心方法 write()、flush()、close()。
  • Reader:字符輸入流父類,核心方法 read()、read(char[])。
  • Writer:字符輸出流父類,核心方法 write()、flush()、close()。
  • RandomAccessFile:支持隨機訪問文件任意位置讀寫。
  • Serializable:序列化標記接口。

五、常用流組合實戰

1. 文件拷貝(字節流 + 緩衝)

try (FileInputStream fis = new FileInputStream("src.txt");
     FileOutputStream fos = new FileOutputStream("dest.txt");
     BufferedInputStream bis = new BufferedInputStream(fis);
     BufferedOutputStream bos = new BufferedOutputStream(fos)) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, len);
    }
}

2. 文本文件讀寫(字符流 + 緩衝)

try (BufferedReader br = new BufferedReader(new FileReader("in.txt"));
     BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
    }
}

3. 標準輸入輸出

  • System.in:標準輸入(鍵盤),類型 InputStream。
  • System.out:標準輸出(控制台),類型 PrintStream,提供 print/println 重載。
  • System.err:標準錯誤輸出,類型 PrintStream。

六、字符流與字節流的轉換橋樑

InputStreamReader 與 OutputStreamWriter 是字節流轉字符流的關鍵,構造時可指定編碼(如 UTF-8、GBK),解決中文亂碼問題。

七、常見 IO 異常

  • FileNotFoundException:文件不存在。
  • EOFException:非正常到達文件/流末尾。
  • InterruptedIOException:IO 操作被中斷。

八、總結與選型建議

  1. 操作二進制文件(圖片、視頻)用字節流;操作文本文件用字符流。
  2. 高頻讀寫務必加緩衝流(Buffered*),減少系統調用開銷。
  3. 大文件、高併發場景優先考慮 NIO(FileChannel、ByteBuffer、Selector)。
  4. 對象持久化用 ObjectOutputStream/ObjectInputStream,實現 Serializable 接口。
  5. 始終在 finally 或 try-with-resources 中關閉流,釋放資源。

掌握 IO 體系架構與核心類職責,是高效處理數據存儲、網絡通信、文件處理的基石。

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