InputStream/OutputStream 體系,最小單元 8 位字節,無緩衝,直接操作磁盤。Reader/Writer 體系,最小單元 16 位字符,支持 Unicode,引入緩衝機制,效率更高。字符流因使用內存緩衝區,讀寫速度遠快於直接操作硬盤的字節流。但文件存儲仍以字節為主,因此字節流在開發中更常用。
ByteArrayInputStream:字節數組輸入FileInputStream:文件輸入,支持文件名、File、FileDescriptorPipedInputStream:管道輸入,線程間通信FilterInputStream:裝飾器基類,派生 DataInputStream(基本類型讀取)和 BufferedInputStream(緩衝)ByteArrayOutputStream:字節數組輸出,自動擴容FileOutputStream:文件輸出,注意平台文件鎖限制PipedOutputStream:管道輸出,配合輸入流實現線程通信FilterOutputStream:裝飾器基類,派生 DataOutputStream 和 BufferedOutputStreamIO 涉及文件、字符串、字節、緩衝等多種功能組合。若用繼承會導致類爆炸。裝飾器模式動態組合功能:
InputStream input = new BufferedInputStream(new FileInputStream("test.txt"));
將 FileInputStream 包裝為 BufferedInputStream,賦予緩衝能力,靈活高效。
public void copybyte(String srcFile, String destFile) throws IOException {
InputStream ins = new FileInputStream(srcFile);
OutputStream outs = new FileOutputStream(destFile);
byte[] buf = new byte[16384]; // 16KB 緩衝區
int len;
while ((len = ins.read(buf)) != -1) {
outs.write(buf, 0, len);
}
ins.close();
outs.close();
}
測試顯示 16KB 緩衝區性能最優,進一步增大無提升,受限於硬盤 I/O 瓶頸。BufferedInputStream 默認緩衝區 8KB,說明仍有優化空間。