ByteArrayInputStream总结:
- ByteArrayInputStream就是提供一个对字节数组的读接口,所以构造函数需要一个字节数组作为数据源。所有的读操作都是对读该数组。
- 因为需要对pos/count进行操作,为了保证多线程下的有效性,所有的read方法都进行了同步。
ByteArrayOutputStream总结:
- ByteArrayOutputStream提高一个对字节数组的写操作,内部将写入的数据放在一个字节数组中。
- 内部数组默认初始长度为32,也可以通过构造函数指定大小。
- writeTo(OutputStream out)可以将缓存的数据保存到真正的目的源中
- 当内部数组容量不足时,会自动扩容
使用场景:
在我的有限经验中很少用到,以下是我的一些理解。
1. 可以存储其他输入流数据,在关闭流之后,仍然可以操作数据(可以释放I/O资源)。
2. 需要对字符串进行字节操作时
ByteArrayInputStream源码
package java.io;
public class ByteArrayInputStream extends InputStream {
//输入源
protected byte buf[];
//下一个读取的数组下标
protected int pos;
//记录要恢复的下标
protected int mark = 0;
//输入源长度
protected int count;
//这两个构造函数都需要传入一个字节数组,而这个数组就输入源,相关read()方法都是从这个数组读取数据
public ByteArrayInputStream(byte buf[]) {
this.buf = buf;
this.pos = 0;
this.count = buf.length;
}
public ByteArrayInputStream(byte buf[], int offset, int length) {
this.buf = buf;
this.pos = offset;
this.count = Math.min(offset + length, buf.length);
this.mark = offset;
}
//byte转int,需要&0xff,为什么不返回byte呢?这个后面另讲
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
public synchronized int read(