13 | Android 高级进阶(源码剖析篇) Square 高效易用的 IO 框架 okio

Posted ACE1985

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13 | Android 高级进阶(源码剖析篇) Square 高效易用的 IO 框架 okio相关的知识,希望对你有一定的参考价值。

作者简介:ASCE1885, 《android 高级进阶》作者。

本文由于潜在的商业目的,未经授权不开放全文转载许可,谢谢!

本文分析的源码版本已经 fork 到我的 Github。

不知不觉 okio 的源码剖析已经到了第六篇,是时候来个结尾了,本文我们重点介绍 okio 的两个核心概念:ByteString 和 Buffer,在前面的文章中也出现过多次,前面所介绍的内容几乎都是为这两个概念服务的。通过第一篇文章我们了解到,ByteString 是不可变的字节序列类,Buffer 是可变的字节序列类。

在 Java 语言中,不可变类指的是这个类的实例是不可修改的,在创建类实例时我们需要指定这个类所有的属性值,而且在以后的生命周期中这些属性值都不能重新赋值。经验丰富的你可能已经知道 Java 中已经存在一些不可变类型,例如 String,BigInteger 和 BigDecimal 等。

不可变类对于开发者来说有如下好处:

  • 易于设计,实现和使用

  • 使用过程中不容易导致出错

  • 更加的安全,可以随意地共用

  • 天然具备线程安全性,无需增加额外的同步操作

关于不可变类的更多内容可以参见我之前的《Java 不可变对象整洁之道》这篇译文。

ByteString

ByteString 表示一个不可变的字节序列,字节数据在初始化时确定,它有三个重载的构造方法,分别从 byte 数组和 ByteBuffer 中获取数据进行初始化,初始化的流程就是首先做参数校验,然后进行字节数据的克隆或者拷贝,最终保存数据到字节数组变量 data 中,代码如下所示:

public class ByteString implements Serializable, Comparable<ByteString> 	
    final byte[] data;	
	
    ByteString(byte[] data) 	
        this.data = data;	
    	
	
    // 将data中所有的数据克隆后用于创建ByteString对象实例	
    public static ByteString of(byte... data) 	
        if (data == null) throw new IllegalArgumentException("data == null");	
        return new ByteString(data.clone());	
    	
	
    // 将data中指定范围的数据拷贝后用于创建ByteString对象实例	
    public static ByteString of(byte[] data, int offset, int byteCount) 	
        if (data == null) throw new IllegalArgumentException("data == null");	
        checkOffsetAndCount(data.length, offset, byteCount);	
	
        byte[] copy = new byte[byteCount];	
        System.arraycopy(data, offset, copy, 0, byteCount);	
        return new ByteString(copy);	
    	
	
    // 根据另外一个ByteBuffer实例数据创建一个新的实例	
    public static ByteString of(ByteBuffer data) 	
        if (data == null) throw new IllegalArgumentException("data == null");	
	
        byte[] copy = new byte[data.remaining()];	
        data.get(copy);	
        return new ByteString(copy);	
    	

第一篇文章我们说到 ByteString 在返回当前字节序列的 UTF-8 编码的字符串数据时使用了缓存的机制,其实是采用空间换时间的思想,在类变量中既保存原始的字节数组 data,也保存了 data 对应的 UTF-8 编码的字符串信息,代码如下所示:

... 更多内容请点击阅读原文继续阅读。

以上是关于13 | Android 高级进阶(源码剖析篇) Square 高效易用的 IO 框架 okio的主要内容,如果未能解决你的问题,请参考以下文章

Android高级进阶(源码剖析篇) 前言

04 | Android 高级进阶(源码剖析篇) 优美的日志框架 logger

Android 高级进阶(源码剖析篇) 小而美的日志框架 timber(上)

Android 高级进阶(源码剖析篇) 小而美的日志框架 timber(下)

Android 高级进阶(源码剖析篇) 便于性能分析的日志框架 hugo

09 | Android 高级进阶(源码剖析篇) Square 高效易用的 IO 框架 okio