SequenceInputStream 將多個 InputStream 邏輯串聯為一個流,讀取時依次從各子流讀取,直到所有流耗盡。構造函數支持兩參數版或 Enumeration 版(多流)。
import java.io.*;
public class MergeFiles {
public static void main(String[] args) throws IOException {
File dir = new File("d:/data");
File[] files = {new File(dir, "a.txt"), new File(dir, "b.txt")};
File outFile = new File(dir, "merged.txt");
// 構造多流枚舉
Vector vec = new Vector<>();
for (File f : files) vec.add(new FileInputStream(f));
SequenceInputStream sis = new SequenceInputStream(vec.elements());
try (FileOutputStream fos = new FileOutputStream(outFile)) {
byte[] buf = new byte[8192];
int len;
while ((len = sis.read(buf)) != -1)
fos.write(buf, 0, len);
} // try-with-resources 自動關閉 fos
sis.close(); // 關閉 sis 會級聯關閉所有子流
}
}
SequenceInputStream 會自動關閉所有子流,無需單獨關閉。SequenceInputStream 不支持 mark/reset。若運行時動態確定流列表,用 Enumeration 包裝 Vector 或自定義 Enumeration 實現。
| 方案 | 優點 | 缺點 |
|---|---|---|
| SequenceInputStream | 標準庫、零拷貝邏輯、自動關閉 | 不支持 mark、異常傳播 |
| 手動循環讀寫 | 完全控制、易錯誤處理 | 樣板代碼多 |
| Files.copy + Files.write (NIO2) | 高性能、原子寫入 | 需臨時文件或內存緩衝 |