java.nio.Buffer flip()方法的用法詳解


  今天在看《Java編程思想》的時候,碰到java.nio.Buffer flip()方法,不明白是干什么用的,於是就趕快查看中文API,API上面翻譯的是:"反轉此緩沖區。首先對當前位置設置限制,然后將該位置設置為零。如果已定義了標記,則丟棄該標記。"; 

  說實話,看了幾遍,真還不明白說的是什么意思,於是就查看英文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.,意思大概是這樣的:調換這個buffer的當前位置,並且設置當前位置是0。說的意思就是:將緩存字節數組的指針設置為數組的開始序列即數組下標0。這樣就可以從buffer開頭,對該buffer進行遍歷(讀取)了。 

  buffer中的flip方法涉及到bufer中的Capacity,Position和Limit三個概念。其中Capacity在讀寫模式下都是固定的,就是我們分配的緩沖大小,Position類似於讀寫指針,表示當前讀(寫)到什么位置,Limit在寫模式下表示最多能寫入多少數據,此時和Capacity相同,在讀模式下表示最多能讀多少數據,此時和緩存中的實際數據大小相同。在寫模式下調用flip方法,那么limit就設置為了position當前的值(即當前寫了多少數據),postion會被置為0,以表示讀操作從緩存的頭開始讀。也就是說調用flip之后,讀寫指針指到緩存頭部,並且設置了最多只能讀出之前寫入的數據長度(而不是整個緩存的容量大小)
  
    實例代碼(借用Java編程思想P552的代碼): 

  

 1 package cn.com.newcom.ch18;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.RandomAccessFile;
 6 import java.nio.ByteBuffer;
 7 import java.nio.channels.FileChannel;
 8 
 9 /**
10  * 獲取通道
11  * 
12  * @author zhq
13  * 
14  */
15 public class GetChannel {
16     private static final int SIZE = 1024;
17 
18     public static void main(String[] args) throws Exception {
19         // 獲取通道,該通道允許寫操作
20         FileChannel fc = new FileOutputStream("data.txt").getChannel();
21         // 將字節數組包裝到緩沖區中
22         fc.write(ByteBuffer.wrap("Some text".getBytes()));
23         // 關閉通道
24         fc.close();
25 
26         // 隨機讀寫文件流創建的管道
27         fc = new RandomAccessFile("data.txt", "rw").getChannel();
28         // fc.position()計算從文件的開始到當前位置之間的字節數
29         System.out.println("此通道的文件位置:" + fc.position());
30         // 設置此通道的文件位置,fc.size()此通道的文件的當前大小,該條語句執行后,通道位置處於文件的末尾
31         fc.position(fc.size());
32         // 在文件末尾寫入字節
33         fc.write(ByteBuffer.wrap("Some more".getBytes()));
34         fc.close();
35 
36         // 用通道讀取文件
37         fc = new FileInputStream("data.txt").getChannel();
38         ByteBuffer buffer = ByteBuffer.allocate(SIZE);
39         // 將文件內容讀到指定的緩沖區中
40         fc.read(buffer);
41         buffer.flip();//此行語句一定要有
42         while (buffer.hasRemaining()) {
43             System.out.print((char)buffer.get());
44         }
45                   fc.close();
46     }
47 }

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


免責聲明!

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



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