java.nio.Buffer 中的 flip()方法

1.flip()方法用來將緩衝區準備爲數據傳出狀態,這經過將limit設置爲position的當前值,再將 position的值設爲0來實現:

後續的get()/write()調用將從緩衝區的第一個元素開始檢索數據,直到到達limit指示的位置。下面是使用flip()方法的例子:java

// ... put data in buffer with put() or read() ...


buffer.flip(); // Set position to 0, limit to old position
while (buffer.hasRemaining()) 
// Write buffer data from the first element up to limit
channel.write(buffer);

2. flip()源碼:編程

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


3.數組

實例代碼(借用Java編程思想P552的代碼): 
[java] view plain copy print?
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緩衝區的第一個位置。dom

相關文章
相關標籤/搜索