Android IO简化之Okio库

2021-01-22 08:30:02

Android IO简化之Okio库

概要

如果之前有使用过Okhttp,那么你一定知道底层的IO读取是由square公司开发的Okio库。它补充了Java.io和java.nio的不足,以便能够更加方便,快速的访问、存储和处理你的数据。而在一般的开发中,我们也可以使用Okio来做IO读写,非常方便深得我心。

核心概念

在日常的开发过程中,Okio的使用非常方便,在于相比java.io库它简化了很多繁杂而且我们平时又使用不到的东西。这其中最核心的两个类便是 Sink, Source。Source可以简单的理解为InputStream 而Sink则对应为OutPutStream。这两个接口都继承Closeable接口,所以在使用结束我们可以当做正常的IO关闭。

Okio工程结构

  • Sink

    它有一子类接口 BufferedSink,BufferedSink的实现类为RealBufferedSink。BufferedSink中定义了一系列写入缓存区的方法,比如write方法写byte数组,writeUtf8写字符串,还有一些列的writeByte,writeString,writeShort,writeInt,writeLong,writeDecimalLong等等方法;

  • Source

    它有一子类接口 BufferedSource。 BufferedSource的实现类为RealBufferedSource,BufferedSource中定义了一系列读取方法,对应上面的写入方法read方法写byte数组,readUtf8写字符串。

两个支持缓冲区的接口的实现类RealBufferedSink和RealBufferedSource都是通过包装一个Sink+Buffer或者Source+Buffer来进行实现的。

说了这么多,直接上代码吧。所有的IO操作,核心代码就只有两行。

示例代码1  如何读取数据

        BufferedSource bufferedSource = null;
        try {
            File file = new File("txt");
            bufferedSource = Okio.buffer(Okio.source(file));
            String content = bufferedSource.readUtf8();
            System.out.println(content);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeQuietly(bufferedSource);
        }

实例代码2 如何写入数据

 BufferedSink bufferedSink = null;
        try {
            File file = new File("txt");
            bufferedSink = Okio.buffer(Okio.Sink(file));
            bufferedSink.writeUtf8("i am zhangsan");
        } catch (Exception e) {
        } finally {
            closeQuietly(bufferedSink);
        }

实例代码3 如何追加文件内容

 BufferedSink bufferedSink = null;
        try {
            File file = new File("txt");
            bufferedSink = Okio.buffer(Okio.appendSink(file));
            bufferedSink.writeUtf8("i am zhengyan");
        } catch (Exception e) {
        } finally {
            closeQuietly(bufferedSink);
        }

最后

我自己在尝试用了再也不想看到Java.io这么臃肿的库,上面展示了比较简单的IO操作,当然Okio还能做的更多。如果你仔细留意会发现我们用的最多的BufferedSink BufferedSource里面都会存在一个Buffer类来支持这缓冲区,我将在下章讲解Buffered类在Okio是如何工作原理的,以及Okio的一些源码分析,谢谢大家阅读。



  • 2019-11-07 08:47:00

    详解vue2.6插槽更新v-slot用法总结

    在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。这篇文章主要介绍了详解vue2.6插槽更新v-slot用法总结,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  • 2019-11-08 09:34:46

    CSS3 Transition详解和使用

    Transition 可以设置 CSS 属性的过渡效果,它有以下几个属性。 transition-property 用于指定应用过渡属性的名称 transition-duration 用于指定这个过渡的持续时间 transition-delay 用于指定延迟过渡的时间 transition-timing-function 用于指定过渡的类型 transition-property transition-property 用于指定应用过渡的属性名称,可以指定多个属性名称,多个属性名称之间用, 分隔。 默认值为 all 也就是所有的元素都应用过渡效果。 例如,想让容器的宽高有一个过渡的效果,就可以这样写:

  • 2019-11-09 19:16:35

    java标记过期方法

    java注解:@Deprecated(不建议使用的,废弃的);@SuppressWarnings(忽略警告,达到抑制编译器产生警告的目的)

  • 2019-11-12 02:56:39

    使用.htaccess重定向后无法显示图片,CSS失效,该如何处理

    现在我需要把这个域名泛解析到blog目录(*.mydomain.org),同时保持另外两个目录的解析不变。尝试对最后一段作以下修改后(前面的内容不变),出现问题:另两个目录中的网站内的图片无法显示,CSS全部失效。