Java ByteBuffer 使用實例

  1. package foo;  
  2.   
  3. import java.io.IOException;  
  4. import java.nio.ByteBuffer;  
  5. import java.nio.CharBuffer;  
  6. import java.nio.charset.Charset;  
  7.   
  8. /** 
  9. ByteBuffer  並且這三個指針的關係是 position<=limit<=capacity. 
  10.  position是當前讀寫的位置。 
  11.  limit是最大能讀寫的位置。 
  12.  capacity是緩存的容量。 
  13.  */  
  14. public class App {  
  15.   
  16.     public static void main(String[] args) throws IOException {  
  17.           
  18.         test001();  
  19.         test002();  
  20.         test003();  
  21.           
  22.         if (true) {  
  23.             return;  
  24.         }  
  25.   
  26.         // 創建一個capacity爲256的ByteBuffer  
  27.         ByteBuffer buf = ByteBuffer.allocate(256);  
  28.         while (true) {  
  29.             // System.out.println("input:");  
  30.             // 從標準輸入流讀入一個字符  
  31.             int c = System.in.read();  
  32.             // 當讀到輸入流結束時,退出循環  
  33.             if (c == -1)  
  34.                 break;  
  35.             // 把讀入的字符寫入ByteBuffer中  
  36.             buf.put((byte) c);  
  37.             // 當讀完一行時,輸出收集的字符  
  38.             if (c == '\n') {  
  39.                 // 調用flip()使limit變爲當前的position的值,position變爲0,  
  40.                 // 爲接下來從ByteBuffer讀取做準備  
  41.                 buf.flip();  
  42.                 // 構建一個byte數組  
  43.                 byte[] content = new byte[buf.limit()];  
  44.                 // 從ByteBuffer中讀取數據到byte數組中  
  45.                 buf.get(content);  
  46.                   
  47.                 // 把byte數組的內容寫到標準輸出  
  48.                 System.out.print(new String(content));  
  49.   
  50.                 // 調用clear()使position變爲0,limit變爲capacity的值,  
  51.                 // 爲接下來寫入數據到ByteBuffer中做準備  
  52.                 buf.clear();  
  53.             }  
  54.         }  
  55.     }  
  56.   
  57.     private static void test003() {  
  58.         ByteBuffer buffer = ByteBuffer.allocate(16);  
  59.         System.out.println("ByteBuffer :");  
  60.         System.out.println("capacity:" + buffer.capacity());  
  61.         buffer.put(new byte[] { 012345678910111213,  
  62.                 1415 });  
  63.         System.out.println("put byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} into buffer.");  
  64.         System.out.println("limit:" + buffer.limit());  
  65.         System.out.println("position:" + buffer.position());  
  66.         buffer.flip();// 數據由寫轉爲讀取  
  67.         System.out.println("ByteBuffer 執行flip,轉爲讀取");  
  68.         byte[] dst = new byte[10];  
  69.         buffer.get(dst, 0, dst.length);  
  70.         System.out.println(String.format(  
  71.                 "byte[]:%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", dst[0], dst[1], dst[2],  
  72.                 dst[3], dst[4], dst[5], dst[6], dst[7], dst[8], dst[9]));  
  73.         System.out.println("讀取完10個字節的數據後:");  
  74.         System.out.println("limit:" + buffer.limit());  
  75.         System.out.println("position:" + buffer.position());  
  76.         buffer.rewind();  
  77.         System.out.println("執行rewind,重新讀取數據");  
  78.         System.out.println("limit:" + buffer.limit());  
  79.         System.out.println("position:" + buffer.position());  
  80.         byte[] dt = new byte[10];  
  81.         buffer.get(dt, 0, dst.length);  
  82.         System.out.println(String.format(  
  83.                 "byte[]:%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", dt[0], dt[1], dt[2],  
  84.                 dt[3], dt[4], dt[5], dt[6], dt[7], dt[8], dt[9]));  
  85.         System.out.println("讀取完10個字節的數據後:");  
  86.         System.out.println("limit:" + buffer.limit());  
  87.         System.out.println("position:" + buffer.position());  
  88.         System.out.println("在當前位置做標記mark");  
  89.         buffer.mark();  
  90.         buffer.get();  
  91.         buffer.get();  
  92.         buffer.get();  
  93.         System.out.println("讀取3個字節後position:" + buffer.position());  
  94.         // buffer.rewind();  
  95.         buffer.reset();  
  96.         System.out.println("執行reset後position的位置:" + buffer.position());  
  97.         // buffer.clear();  
  98.         // System.out.println(buffer.get(3));  
  99.         buffer.compact();  
  100.         System.out.println("取出10個字節後,執行完compact後ByteBuffer第一個字節:"+buffer.get(0));  
  101.     }  
  102.   
  103.     // capacicty:作爲一個內存塊,Buffer有一個固定的大小值,也叫“capacity”.  
  104.     // 你只能往裏寫capacity個byte、long,char等類型。一旦Buffer滿了,需要將其清空(通過讀數據或者清除數據)才能繼續寫數據往裏寫數據。  
  105.   
  106.     // position  
  107.     // 當你寫數據到Buffer中時,position表示當前的位置。初始的position值爲0.當一個byte、long等數據寫到Buffer後,  
  108.     // position會向前移動到下一個可插入數據的Buffer單元。position最大可爲capacity – 1.  
  109.     // 當讀取數據時,也是從某個特定位置讀。當將Buffer從寫模式切換到讀模式,position會被重置爲0.  
  110.     // 當從Buffer的position處讀取數據時,position向前移動到下一個可讀的位置。  
  111.   
  112.     // limit  
  113.     // 在寫模式下,Buffer的limit表示你最多能往Buffer裏寫多少數據。 寫模式下,limit等於Buffer的capacity。  
  114.     // 當切換Buffer到讀模式時,  
  115.     // limit表示你最多能讀到多少數據。因此,當切換Buffer到讀模式時,limit會被設置成寫模式下的position值。  
  116.     // 換句話說,你能讀到之前寫入的所有數據(limit被設置成已寫數據的數量,這個值在寫模式下就是position)  
  117.   
  118.     // flip  
  119.     // flip方法將Buffer從寫模式切換到讀模式。調用flip()方法會將position設回0,並將limit設置成之前position的值。  
  120.     // 換句話說,position現在用於標記讀的位置,limit表示之前寫進了多少個byte、char等 —— 現在能讀取多少個byte、char等。  
  121.   
  122.     // rewind  
  123.     // 將position設回0,所以你可以重讀Buffer中的所有數據。limit保持不變,仍然表示能從Buffer中讀取多少個元素(byte、char等)。  
  124.   
  125.     // 一旦讀完Buffer中的數據,需要讓Buffer準備好再次被寫入。可以通過clear()或compact()方法來完成。  
  126.     // clear  
  127.     // 如果調用的是clear()方法,position將被設回0,limit被設置成 capacity的值。換句話說,Buffer  
  128.     // 被清空了。Buffer中的數據並未清除,只是這些標記告訴我們可以從哪裏開始往Buffer裏寫數據。  
  129.     // 如果Buffer中有一些未讀的數據,調用clear()方法,數據將“被遺忘”,意味着不再有任何標記會告訴你哪些數據被讀過,哪些還沒有。  
  130.     // compact  
  131.     // 如果Buffer中仍有未讀的數據,且後續還需要這些數據,但是此時想要先先寫些數據,那麼使用compact()方法。  
  132.     // compact()方法將所有未讀的數據拷貝到Buffer起始處。然後將position設到最後一個未讀元素正後面。limit屬性依然像clear()方法一樣,設置成capacity。現在Buffer準備好寫數據了,但是不會覆蓋未讀的數據。  
  133.       
  134.   
  135.   
  136.     private static void test002() {  
  137.           
  138.         ByteBuffer buffer = ByteBuffer.allocate(5);          
  139.         System.out.println("初始化:"+buffer.position());    
  140.         System.out.println("初始化:"+buffer.limit());    
  141.         System.out.println("初始化:"+buffer.capacity());    
  142.             
  143.         System.out.println();    
  144.         buffer.put((byte)1);    
  145.             
  146.         System.out.println("放入1個字節:"+buffer.position());    
  147.         System.out.println("放入1個字節:"+buffer.limit());    
  148.         System.out.println("放入1個字節:"+buffer.capacity());    
  149.             
  150.         System.out.println();    
  151.         buffer.flip();    
  152.             
  153.         System.out.println("flip之後:"+buffer.position());    
  154.         System.out.println("flip之後:"+buffer.limit());    
  155.         System.out.println("flip之後:"+buffer.capacity());    
  156.             
  157.         System.out.println();    
  158.         buffer.get();    
  159.             
  160.         System.out.println("拿出一個字節:"+buffer.position());    
  161.         System.out.println("拿出一個字節:"+buffer.limit());    
  162.         System.out.println("拿出一個字節:"+buffer.capacity());    
  163.   
  164.     }  
  165.   
  166.     private static void test001() {  
  167.         String str = "helloWorld";    
  168.         ByteBuffer buff  = ByteBuffer.wrap(str.getBytes());    
  169.         System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());    
  170.         //讀取兩個字節    
  171.         buff.get();    
  172.         buff.get();    
  173.         System.out.println("position:"+ (char)buff.get(buff.position())+"\t limit:"+buff.limit());    
  174.         buff.mark();    
  175.         System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());    
  176.         buff.flip();    
  177.         System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());  
  178.           
  179.     }  
  180.   
  181.     public static byte[] getBytes (char[] chars) {//將字符轉爲字節(編碼)  
  182.            Charset cs = Charset.forName ("UTF-8");  
  183.            CharBuffer cb = CharBuffer.allocate (chars.length);  
  184.       
  185.            cb.put (chars);  
  186.            cb.flip ();  
  187.            ByteBuffer bb = cs.encode (cb);  
  188.            return bb.array();  
  189.     }  
  190.   
  191.     public static char[] getChars(byte[] bytes) {// 將字節轉爲字符(解碼)  
  192.         Charset cs = Charset.forName("UTF-8");  
  193.         ByteBuffer bb = ByteBuffer.allocate(bytes.length);  
  194.         bb.put(bytes);  
  195.         bb.flip();  
  196.         CharBuffer cb = cs.decode(bb);  
  197.         return cb.array();  
  198.     }  
  199.   
  200. }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章