Java I/O機制總結

Java常見的I/O機制都是通過同步的方式實現的,其中又分BIO(阻塞)和NIO(非阻塞),傳統的BIO方式一次(一個線程)只能同時處理一個I/O操作,對於需要同時處理多個客戶端的請求,需要建立對應數目的線程數,對於系統資源是一個很大的開銷;而在NIO的機制中,將所有的I/O操作交由Selector來統一調度,當某個通道(Channel)有可讀/寫數據時,由Selector來完成通道上的數據傳輸,在這種情況下,只需要一個線程就可以控制所有的I/O操作;還有一種應用場景是需要大量I/O操作的程序,通過NIO的方式可以很好的分離出I/O操作模塊負責程序的所有I/O操作,同時對於程序的使用性能也有很大幫助;


BIO的使用:
主要通過io包來完成


NIO的使用
主要通過nio包來完成
三個關鍵的概念:Buffer,Selector,Channel

Buffer(緩存):內存中的一塊區域以及和它相關的一些操作定義的對象,用於和Channel共同完成數據的讀寫操作;
對於Buffer的理解需要明白Java虛擬機,內存,磁盤之間的數據傳輸和交換方式;通過常用的操作函數即可瞭解Buffer的特點

Channel(通道):通道可同時讀寫,採用異步方式,同時Channel可將數據讀取到Buffer中,或從Buffer中寫入到Channel中;

Selector(選擇器):監控每個Channel的狀態,確定它是否處於可讀或可寫的狀態,通過單個線程同時管理多個Channel,多個IO操作;


NIO工作流程:
讀:打開通道–>註冊讀事件到Selector–>Selector查詢到有可讀數據–>完成通道上的數據傳輸

寫:打開通道–>註冊寫事件到Selector,並附加要寫的內容–>Selector查詢到通道可寫–>完成通道上的數據傳輸

注:之所以引入Buffer,一個重要原因是Buffer的讀寫機制很好的保證了在NIO的方式中數據的準確和完整;


當然也有AIO(異步,NIO 2.0)的機制, 主要通過回調的方式來實現,對於讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩衝區,並通知應用程序;對於寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序;
相關實現在nio包中
使用較少


Socket通訊
對於Socket的通訊,其實也可以理解成一種通過Socket方式的I/O,只是底層數據傳輸的方式不同,同樣有BIO和NIO的機制,同樣能夠抽象成SocketChannel,只是創建的方式不同;


通過NIO機制實現的Socket通訊 實例
一些很少接觸的I/O操作類的使用Pipe,ByteArray…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章