IO和NIO的本質與區別


1、IO的本質

  要了解IO和NIO,我們先從計算機原理上來看一下IO是什么?

    IO本質上就是對內存的操作,將數據流寫入內存就是Input,從內存寫出數據流就是Output。

    IO有五種模型:阻塞IO、非阻塞IO、IO多路復用、信號驅動IO、異步IO。

  我們來看下Java應用程序在系統中的IO是什么樣的?

    系統分為用戶空間和內核空間,Java應用運行在用戶空間,因為對所有外部數據的處理都是由系統內核來實現的,對於Java應用程序來說,只是調用操作系統中相應的接口方法,從而和外部數據進行交互。

      

 

  說完這一點我們再了解兩個概念:DMA(也叫協處理器)和虛擬地址空間

  DMA其實就是替CPU分擔IO操作的,因為IO會存在較多的等待時間,所以由DMA來處理IO操作,從而讓CPU更多地去處理計算任務。

  虛擬地址空間:是實際物理地址的映射,是為了不同程序之間的互相隔離和保證程序中地址的確定性。

2、IO和NIO的區別

    先看下二者主要區別:

IO NIO
面向流 面向緩沖
阻塞 非阻塞
選擇器

(1)面向流與面向緩沖

  Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,數據沒有被緩存在任何地方。此外,它不能前后移動流中的數據。Java NIO將數據讀取緩沖區,可以更方便地處理數據。

(2)阻塞與非阻塞

  Java IO中,當一個線程調用 read() 或 write() 方法時,該線程會被阻塞,直到完成數據的讀取或寫入。Java NIO的非阻塞模式,使一個線程從一個通道來讀寫數據,有數據就讀取,沒有也不會阻塞而是可以處理其他邏輯。寫數據時不用等到完全寫入,寫的時候也可以處理其他邏輯。線程通常將非阻塞IO的空閑時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道。

(3)選擇器(Selector)

  Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已准備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

3、IO和NIO的使用

(1)IO的使用

  Java IO中分為DataOutPut和DataInPut,分別對應IO的out和in。

  DataOutPut有三大類,分別是Writer,OutputStream和ObjectOutput。

  DataInput也有三大類,分別是ObjectInput,InputStream和Reader。

InputStream input = ... ; // 磁盤流或網絡流   

BufferedReader reader = new BufferedReader(new InputStreamReader(input));   

String nameLine   = reader.readLine(); 

(2)NIO的使用

  Java NIO需要將數據通過通道讀取到緩沖區中。

ByteBuffer buffer = ByteBuffer.allocate(48);   

int bytesRead = inChannel.read(buffer);   

while(! bufferFull(bytesRead) ) {   
       bytesRead = inChannel.read(buffer);   
} 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM