按照字节读取数据

121 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

前言

兄弟们今天过的怎么样呀?我今天按照计划去爬了个山,上山的时候坐了一段魔毯,下山的时候坐了一段滑梯,在山脚下坐了观光车穿梭于南北山门之间,看到的景色真的是绝美,什么样的坏心情被山里的风一吹就会烟消云散哈哈哈,接下来的几天就可以名正言顺地在家里躺着了
言归正传,上篇文章说到了如何获取到文件的每一行数据,接下来就是对每一行的数据进行解析操作,具体的就是按照字节对照协议标准进行拆分转换,最后封装成JSON格式的数据存入数据库中。今天先记录按照字节读取拆分数据~

代码

按照字节读取数据用到的代码主要就是下面这些:

byte[] data = Base64.getDecoder().decode(dataStr);
ByteBuf buf1 = Unpooled.copiedBuffer(data);
buf1.readShort();
int cmdID = buf1.readUnsignedByte();// 命令标识
buf1.readByte();// 应答标识
byte[] vinBytes = new byte[17];
buf1.readBytes(vinBytes);
String vin = new String(vinBytes);
buf1.readByte();// 加密
int length = buf1.readUnsignedShort();// 长度
byte[] content = new byte[length];
buf1.readBytes(content);

ByteBuf

简介

它其实等同于Java Nio中的ByteBuffer,但是ByteBuf对Nio中的ByteBuffer的功能做了很作增强;与ByteBuffer最大的区别之一,就是ByteBuf可以自动扩容,默认长度是256,如果内容长度超过阈值时,会自动触发扩容;

存储结构

ByteBuf的存储结构其实是一个字节容器,该容器中包含三个部分

  • 已经丢弃的字节,这部分数据是无效的
  • 可读字节,这部分数据是ByteBuf的主体数据,从ByteBuf里面读取的数据都来自这部分; 可写字节,所有写到ByteBuf的数据都会存储到这一段
  • 可扩容字节,表示ByteBuf最多还能扩容多少容量。

在ByteBuf中,有两个指针

  • readerIndex: 读指针,每读取一个字节,readerIndex自增加1。ByteBuf里面总共有witeIndex-readerIndex个字节可读,当readerIndex和writeIndex相等的时候,ByteBuf不可读
  • writeIndex: 写指针,每写入一个字节,writeIndex自增加1,直到增加到capacity后,可以触发扩容后继续写入。
  • ByteBuf中还有一个maxCapacity最大容量,默认的值是Integer.MAX_VALUE,当ByteBuf写入数据时,如果容量不足时,会触发扩容,直到capacity扩容到maxCapacity。

Unpooled

Unpooled工具类,它是同了非池化的ByteBuf的创建、组合、复制等操作。

copiedBuffer

copiedBuffer该方法会实现数据复制,修改了原始ByteBuf的值,并没有影响到复制得到的数组。

ByteBuf常用读方法

image.png

总结

其实从这里就可以看出来,使用到了Netty框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。其实对它的感受不是特别深刻,只是在对每一行的数据进行按字节读取时用到了其中一些类及方法,这就是功力还不够吧!道阻且长呀!