博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO入门-了解Buffer
阅读量:4079 次
发布时间:2019-05-25

本文共 1470 字,大约阅读时间需要 4 分钟。

NIO入门-了解Buffer

 

Buffer实例的状态由下面三个变量来决定:

  • Position,这个变量表明已经读写了多少数据;
  • Limit,这个变量表明还有多少数据需要读写;
  • Capacity,这个变量表明缓冲区的最大容量。

从大小关系来看,Position≤Limit≤Capacity。在通过Buffer进行读写的时候,Buffer.clear()和Buffer.flip()这两个函数将会改变这三个变量,我们可以通过下面这个例子来查看这个过程:

 

01 import java.io.FileOutputStream;
02 import java.nio.ByteBuffer;
03 import java.nio.channels.FileChannel;
04  
05 public class WriteFile {
06     static public void main(String args[]) throws Exception {
07         FileOutputStream fout = new FileOutputStream("out.txt");
08         FileChannel fcout = fout.getChannel();
09         ByteBuffer buffer = ByteBuffer.allocate(1024);
10  
11         buffer.putInt(3);
12         buffer.putInt(24);
13         buffer.putInt(7);
14         System.out.println(buffer.toString());
15         // 输出java.nio.HeapByteBuffer[pos=12 lim=1024 cap=1024]
16  
17         buffer.flip();
18         System.out.println(buffer.toString());
19         // 输出java.nio.HeapByteBuffer[pos=0 lim=12 cap=1024]
20  
21         fcout.write(buffer);
22         System.out.println(buffer.toString());
23         // 输出java.nio.HeapByteBuffer[pos=12 lim=12 cap=1024]
24  
25         buffer.clear();
26         System.out.println(buffer.toString());
27         // 输出java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
28     }
29 }

 

当我们要将数据写到输出通道之前(fux注:即调用session.write方法前),我们必须调用 flip() 方法。这个方法做了两件事情:

  1. 它将 limit 设置为当前 position,在WriteFile.class中,limit被设置成12,这意味着Buffer实例中保存了12字节数据;
  2. 它将 position 设置为 0,在WriteFile.class中,position被设置成0,这意味着Buffer实例下一个读写的位置从0开始。

而clear() 方法会重设缓冲区以便接收更多的字节,这个方法做了两件事情:

  1. 它将 limit 设置为与 capacity 相同。
  2. 它设置 position 为 0。

 

 

 

 

 

posted on 2010-06-09 09:33 阅读(...) 评论(...)

转载地址:http://sepni.baihongyu.com/

你可能感兴趣的文章
我准备把ACfly和T265接上
查看>>
T265源码下载及案例实验(这个人运行成功了realsense里的pose例程,获得位置数据!)
查看>>
网上搜到的树莓派使用串口(uart或者USB)都是Python来用的,我感觉我得换成x86系统来弄或许好些。
查看>>
Mavlink协议是在串口通讯基础上的一种更高层的开源通讯协议,似乎校验更多比串口更可靠?
查看>>
移植mavlink到stm32详细教程,后面附快速移植方法
查看>>
感觉mavlink对于目前的我而言还是麻烦了点,干脆用串口吧(现在回看这可能是错误的想法)
查看>>
树莓派利用串口进行通信(这个是用c写的树莓派的串口)
查看>>
树莓派3 B+ 的串口(USART)使用问题 (也是用C写的)
查看>>
ROS下树莓派USB串口通信(具体为接收到某个ROS的topic数据后,向串口下发数据。)
查看>>
ROS系统的串口数据读取和解析
查看>>
ROS串口编程学习笔记
查看>>
ROS环境下串口通信
查看>>
ros中使用serial包实现串口通信
查看>>
做机械臂导航时遇到的问题5:如何使用ROS内嵌serial功能包实现串口通信
查看>>
ROS为上位机与STM32为下位机串口通讯(一)
查看>>
github上搜了下有ROS uart方面的
查看>>
STM32和ROS的串口通信(这篇是公众号文章写得比较正规详细)
查看>>
全网最实用的STM32和ROS机器人的串口通信方案
查看>>
我觉得还是把ACfly的传感器的逻辑弄清楚,这样再去二次开发好一些。(折腾半天发现有很关键一部分没有开源,怪不得找不到,这让我很失望)
查看>>
freertos工程似乎都是先创建一个任务,再在这个任务里面创建其他任务,似乎就像任务树
查看>>