在談這兩者之前,我先說RandomAccessFile的用法。
RandomAccessFile
RandomAccessFile rfile=new RandomAccessFile(mapFile, "rw");
隨機讀取文件,它的一個實例相當於一個隱含的大數組,當數組裝滿的時候,它會自動的進行擴充。第二個參數代表了mode,用來指定對文件的操作權限。
第一個參數呢?
單純只是一個File對象而已。File file。
爲什麼要先講RandomAccessFile呢?
因爲它的getChannel()函數會返回一個FileChannel對象。
Channel意味通道,渠道。
FileChannel對象是幹什麼的呢?
主要有以上四種功能。
1. 緩衝區的字節可以通過絕對路徑被讀寫,而當前channel的位置不受影響。
2.一個文件的區塊能夠被直接映射到內存中去,特別對大文件來說,更加高效。
3.文件的更新能夠被強制寫到下層的存儲區域。
4.字節能夠在文件和channel之間自由的轉移,並且非常的高效快速。
那麼問題來了,利用Filechannel進行文件映射的過程是什麼樣的?
利用filechannel.map()進行映射。
水到渠成的,MappedByteBuffer就是用來接收map()函數對File映射之後的那個Buffer的。
所以第一個是索引的值,第二個是一個byte value。
buffer被創建的時候,10個byte位全是空的。
學姐在此處,對buffer這個字節數組進行了 byte 0 的初始化操作。注意,ta把0位當做是讀寫位。所以在寫之前置1,在寫完成之後置0。當然在後面的讀操作之前,學姐也進行了置1的操作。