1. 程式人生 > >NIO buffer中的flip方法

NIO buffer中的flip方法

在Java NIO程式設計中,對緩衝區操作常常需要使用  java.nio.Buffer中的 flip()方法。 Buffer 中的 flip() 方法涉及到 Buffer 中的capacity、position、limit三個概念。

  1. capacity:在讀/寫模式下都是固定的,就是我們分配的緩衝大小(容量)。
  2. position:類似於讀/寫指標,表示當前讀(寫)到什麼位置。
  3. limit:在寫模式下表示最多能寫入多少資料,此時和capacity相同。在讀模式下表示最多能讀多少資料,此時和快取中的實際資料大小相同。

 flip():Buffer有兩種模式,寫模式和讀模式。在寫模式下呼叫flip()之後,Buffer從寫模式變成讀模式。 

那麼limit就設定成了position當前的值(即當前寫了多少資料),postion會被置為0,以表示讀操作從快取的頭開始讀,mark置為-1。

也就是說呼叫flip()之後,讀/寫指標position指到緩衝區頭部,並且設定了最多隻能讀出之前寫入的資料長度(而不是整個快取的容量大小)。

flip()原始碼:

public final Buffer flip() {  
    limit = position;  
    position = 0;  
    mark = -1;  
    return this;  
}  

例項程式碼:

package cn.com.newcom.ch18;  
  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.RandomAccessFile;  
import java.nio.ByteBuffer;  
import java.nio.channels.FileChannel;  
  
/** 
 * 獲取通道 
 *  
 * @author zhq 
 *  
 */  
public class GetChannel {  
    private static final int SIZE = 1024;  
  
    public static void main(String[] args) throws Exception {  
        // 獲取通道,該通道允許寫操作  
        FileChannel fc = new FileOutputStream("data.txt").getChannel();  
        // 將位元組陣列包裝到緩衝區中  
        fc.write(ByteBuffer.wrap("Some text".getBytes()));  
        // 關閉通道  
        fc.close();  
  
        // 隨機讀寫檔案流建立的管道  
        fc = new RandomAccessFile("data.txt", "rw").getChannel();  
        // fc.position()計算從檔案的開始到當前位置之間的位元組數  
        System.out.println("此通道的檔案位置:" + fc.position());  
        // 設定此通道的檔案位置,fc.size()此通道的檔案的當前大小,該條語句執行後,通道位置處於檔案的末尾  
        fc.position(fc.size());  
        // 在檔案末尾寫入位元組  
        fc.write(ByteBuffer.wrap("Some more".getBytes()));  
        fc.close();  
  
        // 用通道讀取檔案  
        fc = new FileInputStream("data.txt").getChannel();  
        ByteBuffer buffer = ByteBuffer.allocate(SIZE);  
        // 將檔案內容讀到指定的緩衝區中  
        fc.read(buffer);  
        buffer.flip();// 此行語句一定要有  
        while (buffer.hasRemaining()) {  
            System.out.print((char) buffer.get());  
        }  
        fc.close();  
    }  
}  

 注意:buffer.flip();一定得有,如果沒有,就是從檔案最後開始讀取的,當然讀出來的都是byte=0時候的字元。通過buffer.flip();這個語句,就能把buffer的當前位置更改為buffer緩衝區的第一個位置。