簡介
IO操作一般來講比較耗時,可能操作本地的文件、目錄,也可能操作網絡上的資源,影響 IO 操作性能的主要方面是數據格式和存儲的方式,Java中的IO主要在 java.io 包下,分為四個部分:
1、基于字節操作的 I/O 接口:InputStream 和 OutputStream
2、基于字符操作的 I/O 接口:Reader 和 Writer
3、基于磁盤操作的 I/O 接口:File
4、基于網絡操作的 I/O 接口:Socket
基于字節的 I/O 操作
InputStream 是個抽象類,里面的核心方法是 read(), read(byte b[]),read(byte b[], int len, int off),用于讀取底層數據的方法,可以用來讀取的數據類型包括:字節數組、String對象、文件、管道、流、Internet資源,每一種資源都有相應的InputStream子類
基于字符的 I/O 操作
Writer和Reader操作的目的就是操作字符和不是字節
NIO 非阻塞式 I/O
有一個專門的線程處理 I/O 事件并負責分發;事件驅動機制,而不是同步監視事件;線程之間通過 wait/notify 通信,確保每次線程切換都有意義。
服務端和客戶端各自維護一個管理通道的對象,我們稱之為selector,該對象能檢測一個或多個通道 (channel) 上的事件。我們以服務端為例,如果服務端的selector上注冊了讀事件,某時刻客戶端給服務端發送了一些數據,阻塞I/O這時會調用read()方法阻塞地讀取數據,而NIO的服務端會在selector中添加一個讀事件。服務端的處理線程會輪詢地訪問selector,如果訪問selector時發現有感興趣的事件到達,則處理這些事件,如果沒有感興趣的事件到達,則處理線程會一直阻塞直到感興趣的事件到達為止。
NIO 創建目的是為了讓Java程序員可以實現高速I/O而無需編寫自定義的本機代碼。NIO將最耗時的I/O操作(即填充和提取緩沖區),轉移回操作系統,因而可以極大地提高速度。
NIO最重要的區別是數據打包和傳輸的方式。
一個面向塊的I/O系統以塊的形式處理數據。每一個操作都在一步中產生或者消費一個數據塊。按塊處理數據比按(流式的)字節處理數據要快得多。但是面向塊的I/O缺少一些面向流的I/O