Buffer flip()方法


英文API:Flips this buffer. The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded.

flip()方法 
flip方法將Buffer從寫模式切換到讀模式。調用flip()方法會將position設回0,並將limit設置成之前position的值。 
換句話說,position現在用於標記讀的位置,limit表示之前寫進了多少個byte、char等 —— 現在能讀取多少個byte、char等。 

使用實例:

 

[java]  view plain  copy
 
  1. RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");  
  2. FileChannel inChannel = aFile.getChannel();  
  3.   
  4. //create buffer with capacity of 48 bytes  
  5. ByteBuffer buf = ByteBuffer.allocate(48);  
  6.   
  7. int bytesRead = inChannel.read(buf); //read into buffer.  
  8. while (bytesRead != -1) {  
  9.   
  10.   buf.flip();  //make buffer ready for read  
  11.   
  12.   while(buf.hasRemaining()){  
  13.       System.out.print((char) buf.get()); // read 1 byte at a time  
  14.   }  
  15.   
  16.   buf.clear(); //make buffer ready for writing  
  17.   bytesRead = inChannel.read(buf);  
  18. }  
  19. aFile.close();  

 

 

Buffer的capacity,position和limit 

緩沖區本質上是一塊可以寫入數據,然后可以從中讀取數據的內存。這塊內存被包裝成NIO Buffer對象,並提供了一組方法,用來方便的訪問該塊內存。 
為了理解Buffer的工作原理,需要熟悉它的三個屬性: 

  • capacity
  • position
  • limit

position和limit的含義取決於Buffer處在讀模式還是寫模式。不管Buffer處在什么模式,capacity的含義總是一樣的。 

這里有一個關於capacity,position和limit在讀寫模式中的說明,詳細的解釋在插圖后面。 



capacity 

作為一個內存塊,Buffer有一個固定的大小值,也叫“capacity”.你只能往里寫capacity個byte、long,char等類型。一旦Buffer滿了,需要將其清空(通過讀數據或者清除數據)才能繼續寫數據往里寫數據。 

position 

當你寫數據到Buffer中時,position表示當前的位置。初始的position值為0.當一個byte、long等數據寫到Buffer后, position會向前移動到下一個可插入數據的Buffer單元。position最大可為capacity – 1。 

當讀取數據時,也是從某個特定位置讀。當將Buffer從寫模式切換到讀模式,position會被重置為0。當從Buffer的position處讀取數據時,position向前移動到下一個可讀的位置。 

limit 

在寫模式下,Buffer的limit表示你最多能往Buffer里寫多少數據。 寫模式下,limit等於Buffer的capacity。 

當切換Buffer到讀模式時, limit表示你最多能讀到多少數據。因此,當切換Buffer到讀模式時,limit會被設置成寫模式下的position值。換句話說,你能讀到之前寫入的所有數據(limit被設置成已寫數據的數量,這個值在寫模式下就是position) 

 

 

position:讀的時候表示可以從哪里開始讀,寫的時候表示現在可以從哪里開始寫。

limit:讀的時候表示可以最大可讀位置,寫的時候表示最大可寫的位置。

capacity:容量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM