1、概述
ByteArrayInputStream是一个字节流,它可以把一个byte数组包装成一个输入流。它提供了将一个byte数组的数据读取成一个输入流的功能。我们可以使用ByteArrayInputStream来读取内存中的byte数组并将其转换为InputStream。
2、ByteArrayInputStream的构造函数
1、ByteArrayInputStream(byte[] buf)
创建一个新的ByteArrayInputStream,它使用buf作为其缓冲区数组。The array is not copied. The array is not copied; the reference to the array is kept and later used.
2、ByteArrayInputStream(byte[] buf, int offset, int length)
创建一个新的ByteArrayInputStream,它使用buf作为其缓冲区数组。缓冲区的起始位置是offset,缓冲区的长度是length。The buffer is not copied; the reference to the buffer is kept and later used. The buffer array's mark is set to the specified offset.
3、ByteArrayInputStream的方法
1、close()
关闭此输入流并释放与流相关联的所有资源。一旦流被关闭,试图使用此流读取数据将抛出IOException。
2、available()
返回此输入流当前可以读取(或跳过)的字节数的估计值。
3、mark(int readlimit)
将此流的标记设置在当前的流位置。在标记被设置且未被当前流的方法重置前,调用reset方法可将流重新定位到这一点。
4、markSupported()
测试此输入流是否支持mark和reset方法。
5、read()
从此输入流中读取下一个数据字节,并返回一个byte值,范围从0到255。如果由于已达到流末尾而没有可用的字节,则返回值为-1。
6、read(byte[] b)
从此输入流中将最多b.length个字节的数据读入一个byte数组中。试图读取多于b.length个字节的数据将导致抛出IOException。此方法将阻塞直到一个字节可用,或者流的末尾被检测到。如果流已经结束,返回值为-1。
7、read(byte[] b, int off, int len)
从此输入流中将最多len个字节的数据读入一个byte数组中。试图读取多于len个字节的数据将导致抛出IOException。此方法将阻塞直到一个字节可用,或者流的末尾被检测到。如果流已经结束,返回值为-1。
8、reset()
将此流重新定位到上次对此输入流调用mark方法时的位置。
9、skip(long n)
跳过并丢弃此输入流中的n个字节,而不使其读取到任何字节。
4、示例代码
public static void main(String[] args) throws IOException { String str = "Hello World!"; byte[] byteArray = str.getBytes(); ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray); int data = inputStream.read(); while(data != -1){ char output = (char) data; System.out.print(output); data = inputStream.read(); } inputStream.close(); }
5、总结
通过ByteArrayInputStream,我们可以方便地将一个byte数组中的数据读取为InputStream。此外,ByteArrayInputStream还提供了一些方便的方法,比如mark、reset和skip等。在读取内存中的byte数组时,使用ByteArrayInputStream是非常方便和高效的选择。