使用缓冲视图(view buffer)操纵ByteBuffer

视图缓冲器(view buffer)能让我们过某个特定的基本数据类型的视图查看其底层的ByteBuffer。换言之,就是把ByteBuffer里面的数据都看作某种primitive基本类型数据。但是视图view背后真正存储数据的地方 是ByteBuffer ,所以对view的任何操作都会作用到ByteBuffer上 。正如下面这些实例,有了view,你就能很方便地把基本类型数据primitive读出/写入ByteBuffer了。另外view还能让你既可以一个一个地读/写(实质上就是ByteBuffer的方法)基本类型数据,也可以以批处理的方式(读进/写入一个数组)操作基本类型数据,当然你也可以直接使用ByteBuffer的相应基本类型数据的getXX方法来读基本类型数据。我们很方便地在同一个ByteBufferh建立不同的视图缓冲器,然后将同一字节序列翻译成short,int,float,long和double类型数据,请看ViewBuffers示例。


注,我们只能创建byte基本类型的这种缓冲器ByteBuffer,其余基本类型的缓冲器只能使用"as" 方法来获取。另外你不能把其它基本类型buffer转换成ByteBuffer,不过你可以用view buffer往ByteBuffer里读写基本类型数据 。 

 

Java代码 

 收藏代码

  1. import java.nio.ByteBuffer;  
  2.   
  3. /* 
  4.  * 通过ByteBuffer的缓冲视图读写ByteBuffer字节缓冲 *  
  5.  */  
  6. public class ByteBufferGetData {  
  7.     public static void main(String[] args) {  
  8.         ByteBuffer bb = ByteBuffer.allocate(1024);  
  9.   
  10.         //新创建的ByteBuffer时清零  
  11.         int i = 0;  
  12.         //循环每个字节,看是否有不是零的  
  13.         while (i++ < bb.limit()) {  
  14.             if (bb.get() != 0) {  
  15.                 System.out.println("nonzero");  
  16.             }  
  17.         }  
  18.         System.out.println("i = " + i);//1025         
  19.         bb.rewind();//重置  
  20.   
  21.         /* 
  22.          * byteBuffer.asCharBuffer():获取CharBuffer缓冲视图,可用来直接写入字符 
  23.          */  
  24.         bb.asCharBuffer().put("你好!");//以UTF-16BE编码方式存储  
  25.         char c;  
  26.         /* 
  27.          * byteBuffer.getChar():读取此缓冲区的当前位置之后的两个字节,根据当前的字节顺 
  28.          * 序将它们组成 char 值,然后将该位置增加 2,默认编码为UTF-16BE 
  29.          */  
  30.         while ((c = bb.getChar()) != 0) {  
  31.             System.out.print(c + " ");//你 好 !   
  32.         }  
  33.         System.out.println();  
  34.         bb.rewind();//重置  
  35.   
  36.         /* 
  37.          * byteBuffer.asShortBuffer():获取ShortBuffer缓冲视图,可用来直接写入short ,使用short的put方法会进行类型转换(注意类型转换会截取或改变结果)
  38.          */  
  39.         bb.asShortBuffer().put((short) 32767);  
  40.         /* 
  41.          * byteBuffer.getShort():读取此缓冲区的当前位置之后的两个字节,根据当前的字节顺 
  42.          * 序将它们组成 short 值,然后将该位置增加 2。  
  43.          */  
  44.         System.out.println(bb.getShort());//32767  
  45.         bb.rewind();  
  46.   
  47.         /* 
  48.          * byteBuffer.asIntBuffer():获取IntBuffer缓冲视图,可用来直接写入int 
  49.          */  
  50.         bb.asIntBuffer().put(2147483647);  
  51.         /* 
  52.          * byteBuffer.getInt():读取此缓冲区的当前位置之后的 4 个字节,根据当前的 
  53.          * 字节顺序将它们组成 int 值,然后将该位置增加 4。  
  54.          */  
  55.         System.out.println(bb.getInt());//2147483647  
  56.         bb.rewind();  
  57.   
  58.         /* 
  59.          * byteBuffer.asLongBuffer():获取LongBuffer缓冲视图,可用来直接写入long 
  60.          */  
  61.         bb.asLongBuffer().put(99471142);  
  62.         /* 
  63.          * byteBuffer.getLong():读取此缓冲区的当前位置之后的 8 个字节,根据当前的字节 
  64.          * 顺序将它们组成 long 值,然后将该位置增加 8。 
  65.          */  
  66.         System.out.println(bb.getLong());//99471142  
  67.         bb.rewind();  
  68.   
  69.         /* 
  70.          * byteBuffer.asFloatBuffer():获取FloatBuffer缓冲视图,可用来直接写入float 
  71.          */  
  72.         bb.asFloatBuffer().put(99471142);  
  73.         /* 
  74.          * byteBuffer.getFloat():读取此缓冲区的当前位置之后的 4 个字节,根据当前的字节 
  75.          * 顺序将它们组成 float 值,然后将该位置增加 4。  
  76.          */  
  77.         System.out.println(bb.getFloat());//9.9471144E7  
  78.         bb.rewind();  
  79.   
  80.         /* 
  81.          * byteBuffer.asDoubleBuffer():获取DoubleBuffer缓冲视图,可用来直接写入double 
  82.          */  
  83.         bb.asDoubleBuffer().put(99471142);  
  84.         /* 
  85.          * byteBuffer.getDouble():读取此缓冲区的当前位置之后的 8 个字节,根据当前的字节顺 
  86.          * 序将它们组成 double 值,然后将该位置增加 8。  
  87.          */  
  88.         System.out.println(bb.getDouble());//9.9471142E7  
  89.         bb.rewind();  
  90.     }  
  91. }  

 

Java代码 

 收藏代码

  1. import java.nio.ByteBuffer;  
  2. import java.nio.CharBuffer;  
  3. import java.nio.DoubleBuffer;  
  4. import java.nio.FloatBuffer;  
  5. import java.nio.IntBuffer;  
  6. import java.nio.LongBuffer;  
  7. import java.nio.ShortBuffer;  
  8.   
  9. /* 
  10.  * 使用Buffer视图操作java.nio.ByteBuffer 
  11.  *  
  12.  * +-------------------------------+ 
  13.  * | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 97| byte 
  14.  * +-------------------------------+ 
  15.  * |       |       |       |   a   | char 
  16.  * +-------------------------------+ 
  17.  * |   0   |   0   |   0   |  97   | short 
  18.  * +-------------------------------+ 
  19.  * |       0       |       97      | int 
  20.  * +-------------------------------+ 
  21.  * |      0.0      |    1.36E-43   | float 
  22.  * +-------------------------------+ 
  23.  * |               97              | long 
  24.  * +-------------------------------+ 
  25.  * |            4.8E-322           | double 
  26.  * +-------------------------------+  
  27.  */  
  28. public class ViewBuffers {  
  29.     public static void main(String[] args) {  
  30.   
  31.         /* 
  32.          * 构造ByteBuffer缓冲,占用8个字节,最后一字节内容为实质上是97,整个 
  33.          * 缓冲区连接起来就是64位 00000000.x.x.x.x.x.x.01100001 
  34.          *  
  35.          * 运行结果: 
  36.          * Byte Buffer 
  37.          * 0 -> 0 
  38.          * 1 -> 0 
  39.          * 2 -> 0 
  40.          * 3 -> 0 
  41.          * 4 -> 0 
  42.          * 5 -> 0 
  43.          * 6 -> 0 
  44.          * 7 -> 97 
  45.          */  
  46.         ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, 0, 0, 0, 0, 'a' });  
  47.         bb.rewind();  
  48.         System.out.println("Byte Buffer");  
  49.         while (bb.hasRemaining()) {  
  50.             System.out.println(bb.position() + " -> " + bb.get());  
  51.         }  
  52.   
  53.         /* 
  54.          * 使用CharBuffer视图读取基本类型char字符数据,position两个字节两个字节往后移, 
  55.          * 最后得到4个char 
  56.          *  
  57.          * 运行结果: 
  58.          * Char Buffer 
  59.          * 0 -> 
  60.          * 1 -> 
  61.          * 2 -> 
  62.          * 3 -> 
  63.          */  
  64.         CharBuffer cb = ((ByteBuffer) bb.rewind()).asCharBuffer();  
  65.         System.out.println("Char Buffer");  
  66.         while (cb.hasRemaining()) {  
  67.             System.out.println(cb.position() + " -> " + cb.get());  
  68.         }  
  69.   
  70.         /* 
  71.          * 使用FloatBuffer视图读取基本类型float字符数据,position4个字节4个字节往后移, 
  72.          * 最后得到2个float 
  73.          *  
  74.          * 运行结果: 
  75.          * Float Buffer 
  76.          * 0 -> 0.0 
  77.          * 1 -> 1.36E-43 
  78.          */  
  79.         FloatBuffer fb = ((ByteBuffer) bb.rewind()).asFloatBuffer();  
  80.         System.out.println("Float Buffer");  
  81.         while (fb.hasRemaining()) {  
  82.             System.out.println(fb.position() + " -> " + fb.get());  
  83.         }  
  84.   
  85.         /* 
  86.          * 使用IntBuffer视图读取基本类型int字符数据,position4个字节4个字节往后移, 
  87.          * 最后得到2个int 
  88.          *  
  89.          * 运行结果: 
  90.          * Int Buffer 
  91.          * 0 -> 0 
  92.          * 1 -> 97 
  93.          */  
  94.         IntBuffer ib = ((ByteBuffer) bb.rewind()).asIntBuffer();  
  95.         System.out.println("Int Buffer");  
  96.         while (ib.hasRemaining()) {  
  97.             System.out.println(ib.position() + " -> " + ib.get());  
  98.         }  
  99.   
  100.         /* 
  101.          * 使用LongBuffer视图读取基本类型long字符数据,position8个字节8个字节往后移, 
  102.          * 最后得到1个long 
  103.          *  
  104.          * 运行结果: 
  105.          * Long Buffer 
  106.          * 0 -> 97 
  107.          */  
  108.         LongBuffer lb = ((ByteBuffer) bb.rewind()).asLongBuffer();  
  109.         System.out.println("Long Buffer");  
  110.         while (lb.hasRemaining()) {  
  111.             System.out.println(lb.position() + " -> " + lb.get());  
  112.         }  
  113.   
  114.         /* 
  115.          * 使用ShortBuffer视图读取基本类型short字符数据,position2个字节2个字节往后移, 
  116.          * 最后得到4个short 
  117.          *  
  118.          * 运行结果: 
  119.          * 0 -> 0 
  120.          * 1 -> 0 
  121.          * 2 -> 0 
  122.          * 3 -> 97 
  123.          */  
  124.         ShortBuffer sb = ((ByteBuffer) bb.rewind()).asShortBuffer();  
  125.         System.out.println("Short Buffer");  
  126.         while (sb.hasRemaining()) {  
  127.             System.out.println(sb.position() + " -> " + sb.get());  
  128.         }  
  129.   
  130.         /* 
  131.          * 使用DoubleBuffer视图读取基本类型double字符数据,position4个字节4个字节往后移, 
  132.          * 最后得到1个double 
  133.          *  
  134.          * Double Buffer 
  135.          * 0 -> 4.8E-322 
  136.          */  
  137.         DoubleBuffer db = ((ByteBuffer) bb.rewind()).asDoubleBuffer();  
  138.         System.out.println("Double Buffer");  
  139.         while (db.hasRemaining()) {  
  140.             System.out.println(db.position() + " -> " + db.get());  
  141.         }  
  142.     }  
  143. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值