I/O介紹
I/O即輸入輸出,指的是計算機和世界其他部分的接口,或者是單個程序同計算機其他部分的接口。I/O是計算機系統中的重要元素,並且大量的I/O實際上已經內建到操作系統中瞭。單獨的程序通常都有很多I/O方面的工作要做。
在JAVA中,老的I/O是以“流/Stream”為基礎概念,即所有的I/O都一個個單個字節的流動。在字節流中,每次一個字節,依次通過一個叫做Stream的對象。Stream I/O聯系著計算機和外面的世界。Stream I/O也用在計算機內部,比如把一個對象轉換成bytes或者把bytes反序列化成對象。
NIO具有和原來的老I/O相同作用和目的,但是NIO卻使用瞭一個不同的概念--block I/O(塊I/O)。在本文後面會講到,NIO會比老的基於流的I/O更高效。
為什麼使用NIO?
創建NIO的初衷是為瞭讓JAVA開發人員在不直接使用底層本地代碼的情況下實現高速的I/O操作。NIO的高效歸結與它把那些耗時的I/O操作(比如讀數據進入buffer,或者將buffer中的數據寫入外部設備)都推給瞭操作系統,因此獲得瞭很高的性能。
Streams VS blocks(流和塊的比較)
老I/O和NIO之間最重要的區別在於他們不同的數據打包與傳輸方式。就像之前提到的,老I/O以“流”的方式處理數據,而NIO以“塊”的方式處理數據。
面向流的IO系統每次處理一個字節,輸入流(input stream)每生產一個字節,輸出流(output stream)就消費一個字節。這種工作模式下,非常容易給流數據創建過濾器(filters),而且也很容易將多個過濾器串起來,每個過濾器針對流過自己的字節做相應處理。另一方面,在這種工作模式下面向流的IO通常很慢。
面向塊的IO系統以塊為單位處理數據。每個操作都會生產/消費一“塊”數據,以塊為單位處理數據會比以字節(流)為單位處理數據快很多。但是面向塊的IO系統同時也損失瞭一些優雅而簡單的操作方式。
作者“guibin”