轉載:http://blog.csdn.net/weitry/article/details/52964948html
JAVA基礎系列規劃:java
IO 是主存和外部設備 ( 硬盤、終端和網絡等 ) 拷貝數據的過程。 IO 是操做系統的底層功能實現,底層經過 I/O 指令進行完成。編程
Java 標準 IO 類庫是 io 面向對象的一種抽象。基於本地方法的底層實現,咱們無須關注底層實現。網絡
從處理數據類型上,能夠分爲字節流和字符流;從數據流向上,能夠分爲輸入流和輸出流。併發
- | 字節流 | 字符流 |
---|---|---|
輸入流 | InputStrea | Reader |
輸出流 | OutputStream | Writer |
字節流均繼承自InputStream和OutputStream這兩個抽象類。字符流均繼承自Reader和Writer這兩個抽象類。異步
字節流和字符流的區別,除了讀寫單位和處理對象不一樣外,在文件操做中,字節流在操做時不使用緩衝區(內存),是文件自己直接操做的,而字符流在操做時使用了緩衝區,經過緩衝區再操做文件。編碼
輸入流和輸出流的區別在於流向上,流入程序的爲輸入,從程序流出的爲輸出。spa
Java 標準 IO 類庫提供了數量衆多的封裝類,爲了更加從容的使用這些類,使用標準IO時能夠參考如下原則:操作系統
操做示例可參考《java中的IO整理》.net
Java NIO是JDK1.4以後新出的一套IO接口,這裏的的新是相對於原有標準的Java IO和Java Networking接口。NIO提供了一種徹底不一樣的操做方式:
Channel和Buffer
標準IO的編程接口是面向字節流和字符流的。而NIO是面向通道和緩衝區的,數據老是從通道中讀到Buffer緩衝區內,或者從Buffer寫入到通道中。
Buffer。Buffer是一塊連續的內存塊,是NIO數據讀或寫的中轉地,其只能和Channel對接。
Channel。Channel是數據的源頭或者目的地,用於向Buffer提供數據或者讀取Buffer數據,Buffer的惟一接口,支持異步IO。
Non-blocking
NIO中的N能夠理解爲Non-blocking,不單純是New。Java NIO使咱們能夠進行非阻塞IO操做。好比說,單線程中從通道讀取數據到buffer,同時能夠繼續作別的事情,當數據讀取到buffer中後,線程再繼續處理數據。寫數據也是同樣的。
Selectors
Selector能夠檢測多個通道的事件狀態(例如:連接打開,數據到達),這樣單線程就能夠操做多個通道的數據,實現多路 (non-bloking) 非阻塞式的高伸縮性網絡 I/O