流是連續資料序列的抽象,如同水管中的水流。Java 在 java.io 套件提供豐富的流類別,掌握其分類與核心抽象是高效處理輸入輸出的基礎。
| 維度 | 分類 | 說明 |
|---|---|---|
| 資料方向 | 輸入流 / 輸出流 | 以程式為參考點:讀入為輸入,寫出為輸出 |
| 處理單位 | 位元組流 / 字元流 | 位元組流處理二進位資料;字元流處理文本,自動處理編碼轉換 |
| 功能角色 | 節點流 / 處理流 | 節點流直接連接資料源(檔案、網路);處理流包裝節點流提供緩衝、轉換等增強功能 |
所有具體流類別均繼承自以下四個抽象類:
InputStream:位元組輸入流OutputStream:位元組輸出流Reader:字元輸入流Writer:字元輸出流// 一次性讀取整個檔案
File file = new File("d:/test.txt");
try (InputStream in = new FileInputStream(file)) {
byte[] data = new byte[(int) file.length()];
in.read(data);
System.out.println(new String(data));
}
// 逐位元組讀取(不知大小)
try (InputStream in = new FileInputStream(file)) {
byte[] buf = new byte[1024];
int len, temp;
while ((temp = in.read()) != -1) {
buf[len++] = (byte) temp;
}
System.out.println(new String(buf, 0, len));
}
File file = new File("d:/test.txt");
try (OutputStream out = new FileOutputStream(file)) {
String str = "Hello World";
out.write(str.getBytes());
}
File file = new File("d:/test.txt");
try (Reader in = new FileReader(file)) {
char[] buf = new char[1024];
int len = in.read(buf);
System.out.println(new String(buf, 0, len));
}
File file = new File("d:/test.txt");
try (Writer out = new FileWriter(file)) {
out.write("Hello World");
}
BufferedInputStream/BufferedReader)大幅提升效能。InputStreamReader/OutputStreamWriter)橋接位元組與字元,指定編碼。DataInputStream/DataOutputStream)讀寫基本型別。ObjectInputStream/ObjectOutputStream)。new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")))。理解流的四大抽象類與三大分類維度,能快速定位所需 API。實際開發中,多練習組合流處理各種場景,再深入學習 NIO 以應對高併發需求。