在Java I/O中,有兩種類型的流:節點流(Node Stream)和處理流(Filter Stream)。
節點流(Node Stream)是直接與數據源或數據目的地進行交互的流。它們提供了與底層數據源或數據目的地直接進行讀寫的能力。節點流通常與實際的輸入源或輸出目標進行連接,例如文件、網絡套接字或內存。
處理流(Filter Stream)也稱為包裝流(Wrapper Stream)或裝飾器流(Decorator Stream)。處理流本身并不直接連接到實際的數據源或數據目的地,而是包裝(或裝飾)其他流,通過添加額外的功能來增強底層流的功能。處理流可以提供緩沖、數據轉換、加密、壓縮等功能。
主要區別如下:
1. 功能不同: 節點流提供了直接讀寫數據源或數據目的地的能力,而處理流則提供了對底層流的增強功能,以便更方便、高效地處理數據。
2. 連接方式不同:節點流直接連接到實際的數據源或數據目的地,而處理流則通過包裝(裝飾)其他流來提供額外的功能。處理流通常需要一個底層節點流作為其構造函數的參數。
3. 使用方式不同:節點流可以單獨使用,直接對數據源或數據目的地進行讀寫操作。處理流必須基于一個底層的節點流來進行包裝,以提供額外的功能。處理流可以通過多次嵌套來構建一個流處理管道,從而組合多個功能。
示例代碼如下所示:
// 節點流的使用示例
InputStream inputStream = new FileInputStream("file.txt");
int data = inputStream.read();
// ...
// 處理流的使用示例
InputStream inputStream = new FileInputStream("file.txt");
BufferedInputStream bufferedInput = new BufferedInputStream(inputStream);
int data = bufferedInput.read();
// ...
在上述示例中,`FileInputStream` 是一個節點流,直接連接到文件 "file.txt"。而 `BufferedInputStream` 是一個處理流,它包裝了 `FileInputStream`,提供了緩沖的功能。我們通過 `bufferedInput` 對數據進行讀取。
總結來說,節點流直接連接到數據源或數據目的地,而處理流則提供了對底層流的增強功能。處理流通過包裝其他流來實現額外的功能,并且可以構建流處理管道來組合多個功能。