Java I/O 體系龐大,掌握核心 13 個流類別足以應付絕大多數檔案讀寫場景。本文透過程式碼範例與圖解,系統梳理 FileInputStream、FileOutputStream、緩衝流、資料流、位元組陣列流與物件流的實際用法。

最基礎的檔案讀寫流,直接操作檔案位元組。
public class FileReadDemo {
public static void main(String[] args) throws Exception {
File file = new File("F:\\java\\workspace\\Fanshe\\src\\com\\cyg\\fanshe.java");
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[fis.available()];
int len;
while ((len = fis.read(buffer)) != -1) {
// 處理讀取的資料
}
System.out.println(new String(buffer, 0, len));
fis.close();
}
}
public class FileWriteDemo {
public static void main(String[] args) throws Exception {
File file = new File("F:\\a.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write("admin".getBytes());
fos.flush();
fos.close();
}
}
緩衝流透過內部緩衝區陣列減少實際 I/O 操作次數,大幅提升讀寫效能,並支援 mark() 與 reset() 標記重置功能。
public class BufferedCopyDemo {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("E:\\win10 64\\vmware.log");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("E:\\a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
// 關閉順序:先關外層包裝流,再關內層節點流
bos.close();
fos.close();
bis.close();
fis.close();
}
}

資料流允許以「機器無關」的方式寫入/讀取 Java 基本型別(int、boolean、char 等)與字串,適合結構化資料儲存。
public class DataStreamDemo {
public static void main(String[] args) throws Exception {
// 寫入
FileOutputStream fos = new FileOutputStream("E:\\b.txt");
DataOutputStream dos = new DataOutputStream(fos);
dos.writeInt(10);
dos.writeBytes("admin");
dos.writeChar('a');
dos.writeBoolean(true);
dos.flush();
dos.close();
// 讀取(順序必須與寫入一致)
FileInputStream fis = new FileInputStream("E:\\b.txt");
DataInputStream dis = new DataInputStream(fis);
System.out.println(dis.readInt()); // 10
System.out.println(dis.readByte()); // 'a' 的位元組值
System.out.println(dis.readChar()); // 'a'
System.out.println(dis.readBoolean()); // true
dis.close();
}
}

直接在記憶體中操作位元組陣列,不涉及實體檔案,適合暫存資料、單元測試或資料轉換中介。
public class ByteArrayStreamDemo {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String str = "admin";
baos.write(str.getBytes());
byte[] buffer = new byte[200];
ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes());
bais.read(buffer);
System.out.println(Arrays.toString(buffer)); // 輸出位元組陣列內容
}
}

支援物件序列化與反序列化,將物件完整寫入/讀出檔案。使用時類別必須實作 Serializable 介面。
(原文此處僅列標題,實務範例請參考 Java 序列化教學。)
針對字元資料的高效讀寫,支援 readLine() 按行讀取,處理文字檔案更方便。
(原文此處僅列標題,建議搭配 FileReader/FileWriter 使用。)
new BufferedInputStream(new FileInputStream(file))。flush() 生效。