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. }  

猜你喜欢

转载自1028826685.iteye.com/blog/2406674