BufferedInputStream->FilterInputStream->InputStream
這些類的核心read函數最後都是調用InputStream裏面的read函數,一個byte一個byte的讀取(int->byte),效率不高
public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }
FileInputStream(FileChannel(NIO))->InputStream
上面的BufferedInputStream讀取太慢,FileInputStream引入了NIO中的FileChannel(rt.jar java.nio.channels)提供了緩衝區,提升了InputStream的讀取效率
Java NIO有三大核心部件:java
緩衝區
IO操做通道,能夠操做設備、文件、網絡套接字或程序組件
多路複用選擇器
通道(Channel)和緩衝區(Buffer)。通道表示打開到 IO 目標的鏈接。若須要使用 NIO 系統,須要獲取用於鏈接 IO 目標的通道以及用於容納數據的緩衝區。而後操做緩衝區,對數據進行處理
緩衝區(Buffer):緩衝區是一個線性有限的用來存放從NIO Channel中讀取出得數據的區域
Buffer就是一個數組,用來存放一些特定的數據類型的元素,每種數據類型都有一個對應的緩衝區(除了boolean類型),他們都是Buffer類的子類,其中包括:數組
allocate (int capacity) 是用來分配capacity大小空間返回緩衝區對象的函數
public final Buffer mark() { mark = position; return this; } public final Buffer reset() { int m = mark; if (m < 0) throw new InvalidMarkException(); position = m; return this; }
mark、position、limit、capcity之間的關係:mark <= position <= limit <= capacity
網絡
get:獲取 Buffer 中的數據框架
put:放入數據到 Buffer 中函數
new byte[capacity]
allocateDirect(int)
工廠方法建立直接字節緩衝區。此方法返回的緩衝區一般比非直接緩衝區具備更高的分配和釋放成本。直接緩衝區的內容可能位於正常垃圾收集堆以外,所以它們對應用程序內存佔用的影響可能不明顯。所以,建議將直接緩衝區主要分配給受底層系統本機I/O操做影響的大型、長壽命緩衝區。通常來講,只有當直接緩衝區在程序性能上產生可測量的增益時,才分配直接緩衝區isDirect
方法能夠判斷該緩衝區是否是直接緩衝區未完待續:一篇文章講不完Java NIO,Channel和Selector將在下一篇文章中進行介紹性能