Akka的IO层设计能够參考这篇文档,本文简介一下ByteString的设计。

Immutable消息

Actor之间是通过消息沟通的。但为了避免同步问题,消息必须是Immutable

因此。Akka无法使用byte[]ByteBuffer。而是设计了ByteString来表示二进制数据。理解这一点非常重要,由于ByteString是不可变的。所以ByteString的非常多看似改动状态的方法实际上都是返回一个新的ByteString实例。

假设对StringBigInteger等Java自带的不可变类比較了解。那么就非常easy理解这一点。

Rope数据结构

ByteString是一种类似Rope的数据结构,例如以下图所看到的:

尽管在内部ByteString使用树形结构存储了n个小byte[],但从外部来看。ByteString仍然像是一个大的byte[]。

工厂方法

ByteString是抽象类。不能直接实例化。能够使用工厂方法来创建ByteString实例,ByteString提供了6个工厂方法,例如以下所看到的:

public static ByteString empty()
public static ByteString fromArray(byte[] array)
public static ByteString fromArray(byte[] array, int offset, int length)
public static ByteString fromString(String string)
public static ByteString fromString(String string, String charset)
public static ByteString fromByteBuffer(ByteBuffer buffer)

empty()方法返回一个空的ByteString,其余方法能够依据byte[]。String或者ByteBuffer来创建ByteString实例。须要注意的是,为了保证状态不可改变,工厂方法可能会对数据进行拷贝

经常用法

以下是比較经常使用的一些ByteString方法(我用String的类似方法给出解释):

  • public int size() // string.length()
  • public ByteString concat(ByteString bs) // string.concat(str)
  • public byte head() // string.charAt(0)
  • public ByteString tail() // string.substring(1, string.length())
  • public ByteString take(int n) // string.substring(0, n)
  • public ByteString drop(int n) // string.substring(n, string.length())
  • public ByteString slice(int from, int until) // string.substring(from, until)

ByteStringBuilder

大家都知道,在生成一个长字符串的时候。应该用StringBuilder类(或其线程安全版本号StringBuffer)。出于相同的目的,Akka提供了ByteStringBuilder来创建ByteString。以下是ByteStringBuilder的使用方法演示样例:

ByteStringBuilder bsb = new ByteStringBuilder();
bsb.append(ByteString.fromString("abc"));
bsb.putByte((byte) 1);
bsb.putInt(32, ByteOrder.BIG_ENDIAN);
bsb.putDouble(3.14, ByteOrder.BIG_ENDIAN);
bsb.putBytes(new byte[] {1, 2, 3});
ByteString bs = bsb.result();

ByteIterator

为了方便的訪问ByteString里的数据,Akka提供了ByteIterator类。

能够通过ByteString的iterator()方法获得一份ByteIterator实例,以下是ByteIterator的使用方法演示样例:

ByteIterator it = bs.iterator();
it.getByte();
it.getInt(ByteOrder.BIG_ENDIAN);
it.getDouble(ByteOrder.BIG_ENDIAN);
it.getBytes(new byte[10]);

与java.io互操作

调用ByteStringBuilder的asOutputStream()方法。能够把ByteStringBuilder当成OutputStream来使用。调用ByteIterator的asInputStream()方法。能够把ByteIterator当做InputStream来使用。

结论

ByteString从Immutable的角度来讲,和String非常相似(我猜这也是为什么起名为ByteString的原因)。

使用ByteString的时候,应该牢记这点。

转载于:https://www.cnblogs.com/zfyouxi/p/5057909.html

Akka边学边写(3)-- ByteString介绍相关推荐

  1. 合工大计算机考研导师,合肥工业大学计算机与信息学院导师介绍:胡东辉

    合肥工业大学计算机与信息学院导师介绍:胡东辉 2012-07-21 姓名:胡东辉 性别:男 出生年月:1973/12 职称:副教授 学院:计算机与信息学院 研究方向: 目前研究方向有隐写分析.数字图像 ...

  2. 《花雕学AI》01:尝试使用新必应制作《雕爷学编程》的栏目介绍

    跨年头尾三个月,花雕走完塔克拉玛干沙漠回来后,突然发现世界变了,微软投资的ChatGPT火起来了,特别是升级的ChatGPT4.0,更是异常火热!这一个多月来,人工智能AI突然爆发,能做的事情太多了, ...

  3. 江西财经计算机应用杨教授,江西财经大学信息管理学院研究生导师介绍:刘德喜...

    院校研究生导师对于日后的研究生生涯起到重要的指导作用,因此对目标院校研究生导师一定要了解.以下是中公考研小编为大家整理的"江西财经大学信息管理学院研究生导师介绍:刘德喜"的相关内容 ...

  4. 计算机课Word自我介绍,第5课 用WORD写篇自我介绍.doc

    信息技术教学设计 <用WORD写篇自我介绍>Page: 1 在此课是否与后2课(共3课)合并综合为宜?请大家提意见.我个人现在的看法是,文件操作中的保存与打开越早讲越好.而全角/半角.对单 ...

  5. 介绍计算机的英语作文,总算晓得写一篇介绍电脑的英语作文

    电脑的使用变得越来越普及,我们要正确使用电脑.在英语中也有关于介绍电脑的作文题材,那你想知道写一篇介绍电脑的英语作文怎么写吗?下面小编告诉你如何写一篇介绍电脑的英语作文,大家一起来看看吧! 写一篇介绍 ...

  6. 华北电力大学计算机科学,华北电力大学计算机科学与技术系介绍

    华北电力大学计算机科学与技术系介绍 2010-07-15 计算机科学与技术系 院系简介 华北电力大学计算机专业始建于1977年.1983年开始培养硕士研究生.1997年取得计算机应用技术专业的硕士点. ...

  7. 学语言·写博客·分享交流——《我是一只IT小小鸟》读书笔

    学语言·写博客·分享交流 --<我是一只IT小小鸟>读书笔记(8) 原贴地址:http://byourselves.ycool.com/post.2507061.html 刘未鹏的故事现在 ...

  8. 学计算机还要写作文吗,学电脑写作文

    学电脑写作文以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 1. <我会玩电脑>作文400字 我会游泳,会骑 ...

  9. 合肥工业大学计算机与信息学院导师介绍,合肥工业大学计算机与信息学院导师介绍:周清峰...

    教师信息 姓名 周清峰 性别 男 出生年月 1978,08 最终学位 博士 毕业学校 香港理工大学 (The Hong Kong Polytechnic University) 从事专业 通信与信息系 ...

最新文章

  1. 右键点“工作空间”窗口内空白部分,在弹出的菜单上勾选“Docking View / 停靠式”。然后双击程序窗口的窗棱,就是最上面那条蓝色边框
  2. Redis数据结构:字典(hash表)
  3. FIELD SYMBOL和TYPE REF TO的用法和比较
  4. 华为P50相机新升级:或首发索尼最大底手机CMOS
  5. Mybatis非mapper代理配置
  6. mysql半同步模式_MySQL 半同步复制模式的实现
  7. Linux基础—4.Linux系统管理命令【由图有真相】
  8. Java之Maven配置教程
  9. opencv摄像头常用操作
  10. Java使用DFA算法处理敏感词汇
  11. NOI Linux 2.0 桌面背景展示
  12. php通过JODConverter将word转换为pdf
  13. vscode关闭讨厌的单词拼写检查
  14. C#——lambda表达式和反射
  15. ElasticSearch数据库(ES数据库)简介
  16. java怎么把数据返回给客户端_java 服务器怎样给客户端传输数据
  17. 感谢国内知名 Android 开发者 「stormzhang」推荐了我的公众号
  18. 算算我们80后的小孩今后读大学要花多少钱
  19. Stagefright框架解读(—)音视频Playback流程
  20. 怎么成为高新技术企业?好处有哪些?

热门文章

  1. 今年一个偶然的创业,就改变了我的人生
  2. 创业者如何更好地认知世界?
  3. 创业者需要广泛了解市场中相关产品的基本情况
  4. 微信支付宝是如何赚钱的?
  5. 查看堆内存(histogram)中的对象数量及大小
  6. 面向对象编程(Object-Oriented Programming)
  7. Even better, if you don’t want to answer and
  8. 排序算法(二)--选择排序法
  9. sql高级语法之窗口函数调用
  10. 重载运算符:作为成员函数还是非成员函数