Akka学习笔记(3)-- ByteString

Akka的IO层设计可以参考这篇文档,本文简单介绍一下ByteString的设计。

Immutable消息

Actor之间是通过消息沟通的,但为了避免同步问题,消息必须是Immutable。因此,Akka无法使用byte[]ByteBuffer,而是设计了ByteString来表示二进制数据。理解这一点很重要,因为ByteString是不可变的,所以ByteString的很多看似修改状态的方法实际上都是返回一个新的ByteString实例。如果对StringBigInteger等Java自带的不可变类比较了解,那么就很容易理解这一点。

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.charAt(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的时候,应该牢记这点。

时间: 2024-07-30 06:29:20

Akka学习笔记(3)-- ByteString的相关文章

(转)Akka学习笔记

Akka学习笔记系列文章: <Akka学习笔记:ACTORS介绍> <Akka学习笔记:Actor消息传递(1)> <Akka学习笔记:Actor消息传递(2)> <Akka学习笔记:日志> <Akka学习笔记:测试Actors> <Akka学习笔记:Actor消息处理-请求和响应(1) > <Akka学习笔记:Actor消息处理-请求和响应(2) > <Akka学习笔记:ActorSystem(配置)> &l

Akka学习笔记(2)-- Echo Server

EchoServer 上篇文章里,我们用Akka写了一个简单的HelloWorld例子,对Akka(以及Actor模式)有了初步的认识.本文将用Akka写一个EchoServer,看看在Actor的世界里,如何使用TCP协议. Github项目 照例,EchoServer的代码被放在了Github上.EchoServer比HelloWorld稍微复杂一点,一共有三个类,如下图所示: Main 这次先从主类入手: main()方法的第一行创建了一个Actor系统,名字为mySystem.接下来的四

Akka学习笔记(1)-- Hello, World!

Akka Akka是什么呢?直接引用Akka网站上面的描述吧: Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on the JVM. 反正我觉得Akka是比较难上手的,而且文档对于新手来说,也不太友好.本文会用Akka写一个Hello World程序,从这个程序入手,介绍Akka的一些基本概念. hell

第124讲:Hadoop集群管理之fsimage和edits工作机制内幕详解学习笔记

客户端对hdfs进行写文件时会首先被记录在edits文件中. edits修改时元数据也会更新. 每次hdfs更新时edits先更新后客户端才会看到最新信息. fsimage:是namenode中关于元数据的镜像,一般称为检查点. 一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢? 因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU. 内容包含了namenode管理下的所有datanode

go语言学习笔记

go语言学习笔记 go语言学习笔记(初级) 最近一直在学习go语言,因此打算学习的时候能够记录 一下笔记.我这个人之前是从来没有记录笔记的习惯, 一直以来都是靠强大的记忆力去把一些要点记住. 读书的时候因为一直都是有一个很安静和很专心的环境, 因此很多事情都能记得很清楚,思考的很透彻.但是随着 年纪不断增加,也算是经历了很多的事情,加上工作有时会让人 特别烦闷,很难把心好好静下来去学习,去思考大自然的终极 奥秘,因此需要记录一些东西,这些东西一方面可以作为一种自我激励 的机制,另一方面,也算是自

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------