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

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

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

因此操做系統是以卡車的形式拷貝數據, 可是 Java 基於流的 I/O 模型, 是一鏟子一鏟子的加工數據.socket

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

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

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

這裏雖然指定了讀取數據的大小, 可是要注意, 在讀取時, 並非一次性所有讀取完成, 而是一個一個進行讀取, 讀取的次數就是數組的大小.內存

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

先建立一個緩衝區硬件

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

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

而後使用相似如下代碼來讀取數據到緩衝區.數據

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

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

值得注意的是: 雖然建立緩衝區, 和上面建立的 byte[] 數組做用是同樣的, 都是用來存儲數據. 可是千萬不要搞混了, 流 IO 和 塊 IO 的底層處理方式不同的.
相關文章
相關標籤/搜索