Java 中的 I/O 操作本質上是基於「數據流」進行輸入輸出的機制。數據流代表字符或字節序列的流動,java.io 包提供了讀寫數據的標準 API。無論是文件、網絡還是內存,只要表示數據源的對象,都能以流的形式讀寫。
Java IO 模型採用 裝飾者模式,按功能劃分 Stream,可動態組合裝配。例如需要緩衝的文件輸入流,組合 FileInputStream 和 BufferedInputStream 即可。JDK 1.4 引入 java.nio(New IO),基於通道與緩衝區,大幅提升高併發場景下的 IO 效率。
數據流如水管中的水流,連接「數據源」(外存、內存、緩存)與「程序」。
流的設計使輸入輸出與具體設備解耦,InputStream 不關心數據源設備,OutputStream 不關心目標設備。
InputStream/OutputStream 體系。Reader/Writer 體系,自動處理編碼轉換。FileInputStream、FileReader)。BufferedInputStream、InputStreamReader)。| 來源類型 | 字節流 | 字符流 |
|---|---|---|
| 文件 | FileInputStream / FileOutputStream | FileReader / FileWriter |
| 內存數組 | ByteArrayInputStream / ByteArrayOutputStream | CharArrayReader / CharArrayWriter |
| 字符串 | StringBufferInputStream | StringReader / StringWriter |
| 管道(進程間通信) | PipedInputStream / PipedOutputStream | PipedReader / 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:序列化標記接口。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);
}
}
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();
}
}
System.in:標準輸入(鍵盤),類型 InputStream。System.out:標準輸出(控制台),類型 PrintStream,提供 print/println 重載。System.err:標準錯誤輸出,類型 PrintStream。InputStreamReader 與 OutputStreamWriter 是字節流轉字符流的關鍵,構造時可指定編碼(如 UTF-8、GBK),解決中文亂碼問題。
FileNotFoundException:文件不存在。EOFException:非正常到達文件/流末尾。InterruptedIOException:IO 操作被中斷。Buffered*),減少系統調用開銷。FileChannel、ByteBuffer、Selector)。ObjectOutputStream/ObjectInputStream,實現 Serializable 接口。finally 或 try-with-resources 中關閉流,釋放資源。掌握 IO 體系架構與核心類職責,是高效處理數據存儲、網絡通信、文件處理的基石。