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