緩衝,java緩衝技術

來源:互聯網
上載者:User

緩衝,java緩衝技術

緩衝的意思是中間儲存,相當於中轉站,積累一定的貨物,再往目的地運送。如果沒有中轉站,就會出現一件一件的運送,耗費大量的人力物力。

緩衝的基類是: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()方法,查看本地的資料相片順序。

 

本文原創,待續更新!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.