java 流 I/O 與 塊 I/O 比較

操作系統要移動的是大塊數據(緩衝區), 這往往是在硬件直接存儲器存取 (DMA) 的協助下完成的.

例如硬盤操作, 磁盤控制器通過 DMA 直接將數據寫入內核的內存緩衝區. 一旦磁盤控制器完成了緩存的填寫, 內核從內核空間的臨時緩存拷貝數據到用戶控件緩存中.

所以操作系統是以卡車的形式拷貝數據, 但是 Java 基於流的 I/O 模型, 是一鏟子一鏟子的加工數據.

面向流I/O的系統: 一次處理一個字節的數據. 一個輸入流每次會讀入一個字節的數據,一個輸出流同樣每次次消費一個字節的數據. 例如 Java 中的 SocketInputStreamFileInputStream 都是一次讀取一個.

雖然你讀取的數據時, 可能會使用如下代碼:

byte[] receiveBuffer = new byte[128];
String clientMessage = "";
if((receiveBytes=in.read(receiveBuffer))!=-1) {

這裏雖然指定了讀取數據的大小, 但是要注意, 在讀取時, 並不是一次性全部讀取完成, 而是一個一個進行讀取, 讀取的次數就是數組的大小.

面向塊I/O的系統: 以塊爲單位處理數據. 每個操作步驟會生成或消費一個塊的數據.

先創建一個緩衝區

// 緩衝區的大小
private final static int BUFFER_SIZE = 1024;

// 緩衝區
private ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);

然後使用類似以下代碼來讀取數據到緩衝區.

int len = 0;
while ((len = socketChannel.read(buffer)) > 0) {

也就是說, 直接讀取緩衝區大小的一塊數據, 保存到緩衝區中.

值得注意的是: 雖然創建緩衝區, 和上面創建的 byte[] 數組作用是一樣的, 都是用來存儲數據. 但是千萬不要搞混了, 流 IO 和 塊 IO 的底層處理方式不一樣的.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章