我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕。
本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的用法。
ByteArrayInputStream 介绍
ByteArrayInputStream 是字节数组输入流。它继承于InputStream。
它包含一个内部缓冲区,该缓冲区包含从流中读取的字节;通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的。
我们都知道,InputStream通过read()向外提供接口,供它们来读取字节数据;而ByteArrayInputStream 的内部额外的定义了一个计数器,它被用来跟踪 read() 方法要读取的下一个字节。
InputStream 函数列表
//构造函数
InputStream()intavailable()voidclose()void mark(intreadlimit)booleanmarkSupported()int read(byte[] buffer)abstract intread()int read(byte[] buffer, int offset, intlength)synchronized voidreset()long skip(long byteCount)
ByteArrayInputStream 函数列表
//构造函数
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf, int offset, intlength)synchronized intavailable()voidclose()synchronized void mark(intreadlimit)booleanmarkSupported()synchronized intread()synchronized int read(byte[] buffer, int offset, intlength)synchronized voidreset()synchronized long skip(long byteCount)
InputStream和ByteArrayInputStream源码分析
InputStream是ByteArrayInputStream的父类,我们先看看InputStream的源码,然后再学ByteArrayInputStream的源码。
1. InputStream.java源码分析(基于jdk1.7.40)
1 packagejava.io;2
3 public abstract class InputStream implementsCloseable {4
5 //能skip的大小
6 private static final int MAX_SKIP_BUFFER_SIZE = 2048;7
8 //从输入流中读取数据的下一个字节。
9 public abstract int read() throwsIOException;10
11 //将数据从输入流读入 byte 数组。
12 public int read(byte b[]) throwsIOException {13