緩存的意思是中間存儲,相當於中轉站,積累一定的貨物,再往目的地運送。如果沒有中轉站,就會出現一件一件的運送,耗費大量的人力物力。 緩存的基類是:Buffer 緩存的基本子類有:Char/Byte/Short/Int/Long/Float/Double + Buffer 緩存一般用一個數組做存儲,ar ...
緩存的意思是中間存儲,相當於中轉站,積累一定的貨物,再往目的地運送。如果沒有中轉站,就會出現一件一件的運送,耗費大量的人力物力。
緩存的基類是:Buffer
緩存的基本子類有:Char/Byte/Short/Int/Long/Float/Double + Buffer
緩存一般用一個數組做存儲,array()方法可以獲取這個數組,但並不是所有Buffer都能夠獲取這個數組,使用hasArray()方法的返回值,查看Buffer是否能獲取數組。有兩種情況,Buffer是不能獲取數組。
第一種情況,直接存儲的Buffer:使用new創建一個數組,這個數組使用的存儲空間是堆空間,如果使用JIN,然後直接從記憶體中開闢空間,這樣就可以節省堆空間,解決一些堆空間不足的情況。因此,Buffer分堆存儲,和直接存儲。堆存儲的Buffer使用allocate(int)靜態方法創建,直接存儲的Buffer使用allocateDirect(int)靜態方法創建,wrap(...)靜態方法是自己提供一個數組來創建Buffer,自己提供的數組肯定是屬於堆空間上的。使用isDirect()方法,可以查看Buffer是否為直接儲存,否則為堆存儲。
第二種情況,只讀模式的Buffer:緩存的基本操作就是讀和寫,使用get()方法進行讀取操作,使用put()方法進行寫入操作。Buffer創建的時候,既可以讀,也可以寫。有一種需求,Buffer需要提供給其它操作者,但只能讀,不能寫。使用asReadOnlyBuffer()方法就能創建出一個只讀Buffer,這個只讀Buffer與原Buffer是共用同一個數組,共用數組可以達到節省空間的目的。因此,為了不讓操作者進行寫操作,只讀模式的Buffer就不允許操作者獲得裡面的數組。使用isReadOnly()方法,查看Buffer是否只讀。
緩存在讀取和寫入數組單元時,其操作位與實際操作位會有偏差,使用arrayOffset()方法,可以獲得這個偏差量。以下方法的參數和返回值,都是相對於偏差量的。
- 當前操作位:position()/position(int)
- 操作結束位:limit()/limit(int)
- 操作結束位的最大值:capacity()
每次操作完後,當前操作位就會指向下一個數組單元。一直到操作結束位時,緩存就不允許再操作。通過limit()-position(),也可以使用remaining()方法,查看剩餘操作量。使用hasRemaining()方法,查看是否還能操作。
當前操作位與操作結束位可以通過position(int)和limit(int)方法單獨調整,也可以通過其它方法進行整體調整。
- clear()方法,調整position為0,limit為capacity,表示清除已有數據,等待寫入數據。
- flip()方法,調整limi為position,position為0,表示寫數據完畢,等待讀取數據。
- rewind()方法,調整position為0,表示重新寫入或重新讀取數據。
- reset()方法,調整position為回檔位,表示操作從回檔位開始。回檔位是需要事先使用mark()方法標記當前操作位為回檔位,回檔位不能大於當接操作位,否則在調整過程中,回檔位被消除。
- compact()方法,把未讀數據複製至開始位置,調整position為剩餘量,調整limit為capacity,表示清除已讀數據,保留未讀數據,並等待寫入數據。
(註:圖源於http://www.cnblogs.com/hvicen/p/6138690.html)
該圖表示出Buffer在寫與讀的時候,limit所處的位置,左邊是寫模式,右邊是讀模式。使用flip()方法,使寫模式轉變為讀模式。使用clear()和compact()方法,使讀模式轉變為寫模式,clear()是清空所有數據,compact()只清除已讀數據,保留未讀數據。
使用duplicate()方法,拷貝出一個屬性和狀態一致的Buffer,兩個Buffer是共用數組。
使用slice()方法,構建出一個Buffer,這個Buffer以當前操作位的實際操作位為偏差量,以剩餘操作量為操作結束位的最大值。換句話說,slice的意思是切片,切出一個從當前操作位到操作結束位的Buffer,這個Buffer的讀與寫只能在這一段上面進行,同樣切出來的Buffer與原Buffer是共用數組。
一個數據單元可以切分成多個位元組,例如一個整型數據可以切分成四個位元組,存儲在數組時,可以從高位到低位存儲,也可以從低位到高位存儲。使用order()/order(ByteOrder)方法,可以查看和設置一個數據單元的排列方式,低位到高位排列為ByteOrder.BIG_ENDIAN,高位到低位排列為ByteOrder.LITTLE_ENDIAN。使用ByteOrder.nativeOrder()方法,查看本地的數據排列方式。
本文原創,待續更新!