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的一些源码分析,谢谢大家阅读。