okio 作为 okhttp 的底层 IO 库,对比 Java 的原生 IO ,提供了更灵活易用的API 来处理数据流的输入和输出,某程度上,我们可以放弃 Java 的原生 IO,转为使用 okio 作为 日常开发的 IO 框架
在正式介绍 okio之前,我们有必要先来回顾一下 Java IO 的一些基础知识
程序内部和外部进行数据交互的过程,这个输入输出(input/output) 的过程,就是 IO
在 Java 的世界里面,IO 是一种流的概念,所有的 IO 操作可以被看作是字节在流中的移动
下面我们来看下,使用 Java IO 读写文件的操作吧,这里读取一下本地的 txt 文本:
public void javaIO(View view) {
String mPath = getCacheDir() + File.separator + "article.txt";
long start = System.nanoTime();
try {
BufferedReader reader = new BufferedReader(new FileReader(mPath));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
Log.e("IO", builder.toString());
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
Log.e("IO", "javaIO 耗时为: " + (System.nanoTime() - start));
}
}
然后就可以看到下面的输出结果了:
可以看到顺利读取到本地的文本,代码执行耗时为:1134385
但是就这么一个简单需求就要写这么一大堆代码, 一次两次或者还可以忍受,但是次数多了,不觉得 Java 原生 IO 的 API,太笨重了吗?
okio 重新定义了一系列的 IO API,用了两个全新的 API 来表示输入流和输出流
我们先来看下使用 okio 实现同意的需求应该怎么去写:
public void okio(View view) {
String mPath = getCacheDir() + File.separator + "article.txt";
long start = System.nanoTime();
try {
Source source = Okio.source(new File(mPath));
String read = Okio.buffer(source).readString(Charset.forName("utf-8"));
Log.e("IO", read);
source.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
Log.e("IO", "okio耗时为: " + (System.nanoTime() - start));
}
}
使用 okio 实现同样的功能,明显轻松得多,而且 okio中的类被特意地设计为支持链式调用,而使用链式调用,就能产生简洁、优美、易读的代码,最关键是 API 特别友好,对比 Java IO,感觉都可以放弃原生 IO 了
而且这里我们可以看到,一样是对本地文本的读写,okio 的执行效率比 Java IO 快了很多,耗时仅为 728462,这个是为什么呢?
想知道 okio 的效率为什么要比 Java 的原生 IO 高,就要先搞明白什么叫做 阻塞 IO 和 非阻塞 IO
由此,我们可以知道 Java 的原生 IO 就是一种 阻塞 IO,它是个傻大个,在得到想要的结果之前就只会傻傻得原地等待
而 okio 则是给傻大个充值了一笔智商税,如果暂时无法得到想要的结果,就会先去干别的事情,比方说打扫下卫生,喝杯水,然后再去看下能否得到想要的结果
非阻塞IO 本身并不会比 阻塞IO 快,但是它能一定程度提高 CPU 的执行效率 ,提现出来就是更快的处理速度了
这里先简单介绍一下 okio 的简单用法以及一些 IO 的概念,下篇开始源码的分析