1.對java.nio包的理解
java.nio.*包中引入了新的JavaI/O類庫 為了提高IO讀寫速度。用緩衝和通道更加接近作業系統的IO方式
我們要讀取到資料,並沒有直接和通道互動;只是和緩衝器互動,並把緩衝器派送到通道。通道要麼從緩衝器獲得資料,要麼向緩衝器發送資料!
使用者資料讀寫<-->ByteBuffer<--->FileChannel
2.緩衝區
特定基本類型元素的線性有限序列。除內容外,緩衝區的基本屬性還包括容量、限制和位置
讀寫資料時候 本質就是從此緩衝區的“位置”處一直讀到“限制”處!
3. FileChannel的read(ByteBuffer bf):將位元組序列從FileChannel讀入給定的緩衝區ByteBuffer bf 中!讀完以後,bf的當前位置就是從FileChannel中讀取的位元組個數!
同理,我們應該可以很容易想象出write(ByteBuffer bf)它就是用來將位元組序列從給定的緩衝區ByteBuffer bf寫入通道FileChannel
3. ByteBuffer 和通道交換作用
通過告知分配多少儲存空間來建立一個ByteBuffer對象
ByteBuffer的flip():反轉此緩衝區,將限制設定為當前位置,然後將位置設定為 0 !(本質就是設定buff開始位置和結束位置 以便後面可以讀寫buff)
4.代碼實現
FileChannel fc = new FileOutputStream("s.txt").getChannel();<br />fc.write(ByteBuffer.wrap("Some text".getBytes()));//將 byte 數組封裝到緩衝區中buff中去,然後寫到fc中去<br />fc.close();<br />fc = new RandomAccessFile("s.txt", "rw").getChannel();<br />fc.position(fc.size());//到最後位置然後 後面的byte加到後面<br />fc.write(ByteBuffer.wrap("Some more".getBytes()));<br />fc.close();<br />fc = new FileInputStream("s.txt").getChannel();<br />ByteBuffer buff = ByteBuffer.allocate(BSIZE);<br />fc.read(buff);<br />buff.flip();<br />while (buff.hasRemaining()) {// 是否到達限定的位置<br />System.out.println((char) buff.get());<br />}
總結如下:
1. put 資料時, 不會自動清除緩衝區中現有的資料.
2. 每一次 get 或 put 後, curPointer 都將向緩衝區尾部移動, 移動量=操作的資料量.
3. get/put 均是從 curPointer 起, 到 curPointer + 操作的資料長度止.
4. get/put 操作中, 若 curPointer 超過了 endPointer 或緩衝區總長度, 將拋出 java.nio.BufferUnderflowException 異常.