Akka边学边写(3)-- ByteString介绍
Akka的IO层设计能够參考这篇文档,本文简介一下ByteString的设计。
Immutable消息
Actor之间是通过消息沟通的。但为了避免同步问题,消息必须是Immutable。
因此。Akka无法使用byte[]或ByteBuffer。而是设计了ByteString来表示二进制数据。理解这一点非常重要,由于ByteString是不可变的。所以ByteString的非常多看似改动状态的方法实际上都是返回一个新的ByteString实例。
假设对String或BigInteger等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的时候,应该牢记这点。
Akka边学边写(3)-- ByteString介绍的更多相关文章
- Akka边学边写(1)-- Hello, World!
Akka Akka是什么呢?直接引用Akka站点上面的描写叙述吧: Akka is a toolkit and runtime for building highly concurrent, dist ...
- Akka边学边写(4)-- MiniRPG
前面几篇文章用Akka写了HelloWorld和EchoServer,为了更进一步学习Akka,本文将会实现一个非常小的RPG游戏server:MiniRPG. 游戏逻辑 由于是迷你RPG,所以逻辑非 ...
- Akka边学边写(2)-- Echo Server
EchoServer 上篇文章里,我们用Akka写了一个简单的HelloWorld样例,对Akka(以及Actor模式)有了初步的认识.本文将用Akka写一个EchoServer,看看在Actor的世 ...
- Django学习笔记(现学现写,实时更新)
说明:我是先上手做一些简单的例子,然后在尝试的过程中理解Django的原理,笔记也是按这个思路来的. 一.Django结构与基本文件介绍 1. django-admin.py 工程管理工具,主要用于创 ...
- 跟我一起写Makefile:MakeFile介绍
makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序. 首先,我们用一个示例来说明makefile的书写规则.以便给大家一个感性认识.这 ...
- 跟我学android-Android应用基本组件介绍(五)
Activity activity 是最基本的模块,我们成为活动,一个activity通常就是一个单独的屏幕,每一个活动都被实现为一个独立的类,且都继承活动的基类.在activity的实现类里显示用户 ...
- [C++][OpenGL]自己写GUI(0)——介绍
文章可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6928612.html.文章未完,如果不在博客园(cnblogs)发现本文,请访问前面的链接查 ...
- 零基础学python-5.1 数字简单介绍
1.创建数值对象并赋值 a=1#整数 b=1.1#浮点数 c=1.23e5#实数 d=1.23+4.56j#虚数 2.更新数值对象 注意:由于数值对象是不可变,所以与其说更新,还不如说把变量名从一个对 ...
- 跟我学SpringCloud | 第一篇:介绍
首先讲一下我为什么要写这一系列的文章,现在网上大量的springcloud相关的文章,使用的springboot和springcloud的版本都相对比较老,很多还是在使用springboot1.x的版 ...
随机推荐
- MFC如何生成一个可串行化的类
一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...
- Android各代码层获取系统时间的方法
1. 在java层,long now = SystemClock.uptimeMillis(); 2. 在native层,nsecs_t now = systemTime(SYSTEM_TIME_MO ...
- jsp:setProperty
类声明: package test; public class Student { private int age; public int getAge() { return ...
- c++ __declspec关键字详细用法
c++ __declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的 ...
- Emotion英语学习
英语学习断断续续也快两年了,以前也蜻蜓点水地写过几篇总结,但是因为思考的少,只能得到一些表面的收获.从今年三月初到现在,口语阶段已经有三个月,感触较多,所以写这篇博客对这段时间英语学习的一个整体总结. ...
- flex网上办(苹果)桌面系统仿真
1.有登录界面 2.能够载入app(每一个app是单独的swf),并可拖动app的图标互相叠加 3.桌面上显示的哪些APP与目录是依据登陆的用户信息.从webservice中读取的(名字.图标信息等) ...
- [ACM] hdu 4405 Aeroplane chess (概率DP)
Aeroplane chess Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 ...
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...
- chmod u+s(转)
参看了 http://hi.baidu.com/hehongrong/item/b64a6d6b094cf634ac3e8382 里面说 -s :在文件执行时把进程的属主或组ID置为该文件的文件属主. ...
- DataGirdView 设置单元格居中
设置标题行居中: dgvShow.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter ...