`
1028826685
  • 浏览: 940828 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

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

 

分享到:
评论

相关推荐

    Java NIO学习笔记——ByteBuffer用法

    1. 创建ByteBuffer实例,分配一定的容量。 2. 使用put()方法填充数据。 3. 调用flip()切换到读模式。 4. 使用get()方法读取数据,可能配合其他Buffer或Channel进行数据传输。 5. 根据需要调用clear()或compact()(只...

    ByteBuffer.zip

    - 缓冲区分配:创建一个足够大的ByteBuffer实例,以便容纳所有的字节数据。 - 写入数据:使用ByteBuffer的put方法将转换后的字节序列写入缓冲区,可以按单个字节、短整型、整型、长整型或其他自定义字节数组进行...

    Android中的ByteBuffer解析

    3. **复用缓冲区**:在多次读写操作中,尽可能复用已有的ByteBuffer实例,减少对象创建。 总的来说,ByteBuffer是Android开发中处理二进制数据的强大工具,熟练掌握其用法和优化策略,可以显著提高应用程序的性能。...

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    2. 基于池化的管理:Mina通过缓冲区池来复用ByteBuffer实例,减少频繁的创建和销毁操作,提高性能。 3. 多种类型支持:Mina提供多种类型的ByteBuffer,如HeapByteBuffer、DirectByteBuffer和复合缓冲区,可以根据...

    MongoDB之Java使用例子

    在这个“MongoDB之Java使用例子”中,我们将深入探讨如何在Java环境中操作MongoDB数据库,包括增、删、改、查(CRUD)操作以及图像数据的存储和检索。 首先,Java与MongoDB的交互主要通过MongoDB的Java驱动程序实现...

    java api之ByteBuffer基础、应用场景、实战讲解

    java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现

    Android在JNI中使用ByteBuffer的方法

    同时,使用相同的ByteBuffer实例并清除或回绕它,可以避免频繁创建新缓冲区带来的性能损失。 总结来说,Android在JNI中使用ByteBuffer主要是为了提高数据传输的效率,通过直接访问内存,减少数据拷贝,从而提升应用...

    实现java网络与nio例子

    - 缓冲区(ByteBuffer)用于存储数据,可以使用`ByteBuffer.allocate()`分配内存,`put()`写入数据,`flip()`切换到读模式,`get()`读取数据,`clear()`或`compact()`清空缓冲区。 2. **客户端实现**: - 客户端...

    javaNIO实例

    在这个javaNIO实例中,我们可以学习到如何利用Java NIO进行文件的读取、写入以及复制操作。 首先,NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的路径,如文件通道...

    Java实现多个wav文件合成一个的方法示例

    在Java中,编码转换是通过使用`ByteBuffer`类来实现的。`ByteBuffer`类提供了各种方法来将数字类型转换为字节数组。在上面的代码中,我们使用了`intToByteArray`方法将整数类型转换为字节数组,以便写入wav文件中。 ...

    java NIO原理和使用

    #### 三、Java NIO 使用实例 下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io....

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    描述中的“java nio 编程一个实例子.服务端程序”提示我们,这个实例是一个服务器端的应用,它利用Java NIO来处理客户端的连接请求。在NIO服务端编程中,通常会使用`Selector`来监听多个通道的事件,当有新的连接、...

    JAVA Socket编程实现文件上传

    Java的`java.nio`包提供了ByteBuffer类,可以处理网络字节顺序问题,确保数据在不同平台上的一致性。 5. **数据库交互**:在服务器端,接收到文件内容后,需要将其保存到数据库。这通常涉及到SQL语句的执行,以及...

    java-nio.rar_java nio_nio 对象实例化

    总结来说,这个压缩包的内容可能涵盖了如何在Java NIO中实例化和使用通道、缓冲区、选择器,以及如何实现一个简单的多线程服务器,利用选择器来监听和处理来自多个客户端的非阻塞I/O请求。这些内容对于理解和使用...

    明华读卡器Java例程

    Java提供了强大的数据处理工具,如ByteBuffer和BitSet,以及各种字符编码的转换方法。 8. **事件驱动编程**:如果读卡器支持事件通知,例程可能会采用事件监听器模式,当读卡器检测到新卡片或者其他事件时,触发...

    JAVA-NIO程序设计完整实例

    Java提供了多种类型的Buffer,如ByteBuffer、CharBuffer、IntBuffer等,它们都继承自Buffer抽象类。 - **选择器(Selector)**: 选择器允许单个线程管理多个通道,通过注册感兴趣的事件(如读、写、连接完成等),...

    netty深入学习资料(java源代码实例)

    与Java的ByteBuffer相比,ByteBuf更易于使用,功能更强大。 五、Netty的零拷贝 Netty通过FileRegion和CompositeByteBuf实现了零拷贝,减少了CPU和内存之间的数据传输,提升了性能。 六、Netty的编码解码器 Netty...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO...对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。

    取指定字节数组中的子数组 一个很好类例子

    在Java编程中,这样的操作通常是通过使用数组拷贝或者特定的类如`java.nio.ByteBuffer`来实现的。描述中提到的"博文链接"提供了进一步了解这个话题的资源,但在这里,我们将基于通常的编程实践来探讨这个主题。 在...

    java调用第三方C++ dll 实例源码和说明

    在Java中,没有直接对应C++结构体的概念,但我们可以使用`ByteBuffer`或自定义的Java类来映射C++结构体。例如,如果C++有以下结构体: ```cpp struct MyStruct { int value1; double value2; }; ``` 在Java中,...

Global site tag (gtag.js) - Google Analytics