java.nio.Buffer.filp()方法的用法詳解
今天在看《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緩衝區的第一個位置。
相關文章
- jQuery的bind()方法用法詳解jQuery
- jQuery stop()方法用法詳解jQuery
- axios的用法詳解iOS
- struct的匿名用法詳解Struct
- 【jar命令的用法詳解】JAR
- extern用法詳解
- Metasploit用法詳解
- xargs用法詳解
- Nmap用法詳解
- mount用法詳解
- Selenium用法詳解 -- Selenium3 常用方法
- Object.defineProperty的用法詳解Object
- C#DataTable的用法詳解C#
- sar命令的用法和詳解
- Flutter ListView 用法詳解FlutterView
- MyBatis Generator 用法詳解MyBatis
- iconfont用法詳解
- Promise用法詳解(一)Promise
- StringTie用法詳解
- SVG <markers>用法詳解SVG
- Elasticsearch SQL用法詳解ElasticsearchSQL
- git stash用法詳解Git
- JSONP用法詳解JSON
- Generator用法詳解+co
- appendChild()用法詳解APP
- jQuery 事件用法詳解jQuery事件
- SVG transform用法詳解SVGORM
- expdp/impdp 用法詳解
- expdp/impdp用法詳解
- awk sed 用法詳解
- MySQL中BETWEEN子句的用法詳解MySql
- 詳解MySQL中WHERE子句的用法MySql
- Java 中 this 和 super 的用法詳解Java
- C# 之 static的用法詳解C#
- javascript的replace()函式用法詳解JavaScript函式
- javascript的sort()函式用法詳解JavaScript函式
- javascript function的多種用法詳解JavaScriptFunction
- xargs的原理剖析及用法詳解