持续创作,加速成长!这是我参与「掘金日新计划 · 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常用读方法
总结
其实从这里就可以看出来,使用到了Netty框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。其实对它的感受不是特别深刻,只是在对每一行的数据进行按字节读取时用到了其中一些类及方法,这就是功力还不够吧!道阻且长呀!