英文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等。
使用實例:
- RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
- FileChannel inChannel = aFile.getChannel();
- //create buffer with capacity of 48 bytes
- ByteBuffer buf = ByteBuffer.allocate(48);
- int bytesRead = inChannel.read(buf); //read into buffer.
- while (bytesRead != -1) {
- buf.flip(); //make buffer ready for read
- while(buf.hasRemaining()){
- System.out.print((char) buf.get()); // read 1 byte at a time
- }
- buf.clear(); //make buffer ready for writing
- bytesRead = inChannel.read(buf);
- }
- 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:容量。