高效易用的okio(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/f409031mn/article/details/84947367

okio 作为 okhttp 的底层 IO 库,对比 Java 的原生 IO ,提供了更灵活易用的API 来处理数据流的输入和输出,某程度上,我们可以放弃 Java 的原生 IO,转为使用 okio 作为 日常开发的 IO 框架

Java 的原生 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

okio 重新定义了一系列的 IO API,用了两个全新的 API 来表示输入流输出流

  • Sources:输入流,同 Java IO 中的 InputStream
  • Sinks:输出流,同 Java IO 中的 OutputStream

我们先来看下使用 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,这个是为什么呢?

阻塞 IO 与 非阻塞 IO

想知道 okio 的效率为什么要比 Java 的原生 IO 高,就要先搞明白什么叫做 阻塞 IO非阻塞 IO

  • 阻塞 IO:当请求的资源(本地文件,网络数据等)时,如果遇到资源暂不可访问的情况,阻塞 IO 会一直原地等待,不断重复尝试读取数据,直到读取到数据或超时为止,期间线程一直都处于阻塞状态, CPU 利用率极低
  • 非阻塞 IO:当请求的资源暂时不可用时,就立即返回,不会阻塞线程,隔一段时间后再去请求资源,直到资源请求成功并顺利进入读写阶段,在进入读写阶段前, CPU 可以去干别的事情, 利用率得到极大的提高

由此,我们可以知道 Java 的原生 IO 就是一种 阻塞 IO,它是个傻大个,在得到想要的结果之前就只会傻傻得原地等待

okio 则是给傻大个充值了一笔智商税,如果暂时无法得到想要的结果,就会先去干别的事情,比方说打扫下卫生,喝杯水,然后再去看下能否得到想要的结果

非阻塞IO 本身并不会比 阻塞IO 快,但是它能一定程度提高 CPU 的执行效率 ,提现出来就是更快的处理速度了

总结

这里先简单介绍一下 okio 的简单用法以及一些 IO 的概念,下篇开始源码的分析

猜你喜欢

转载自blog.csdn.net/f409031mn/article/details/84947367
今日推荐