两种方法都将字节写入输出流。要先比较它们,我们应该查看它们的源代码:
一方面,在 OutputStream 类中,我们有这 3 个嵌套方法来写入字节:
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
public void write(byte b[], int off, int len) throws IOException {
Objects.checkFromIndexSize(off, len, b.length);
for (int i = 0 ; i < len ; i++) {
write(b[off + i]);
}
}
public abstract void write(int b) throws IOException;
以上所有方法都会抛出 UncheckedException。
另一方面,ByteArrayOutputStream 的 writesByte 方法调用此方法:
public void writeBytes(byte b[]) {
write(b, 0, b.length);
}
public synchronized void write(byte b[], int off, int len) {
Objects.checkFromIndexSize(off, len, b.length);
ensureCapacity(count + len);
System.arraycopy(b, off, buf, count, len);
count += len;
}
这些方法在写入字节之前检查字节数组的容量,因此它们摆脱了 UncheckedException。另外,write 方法是交易安全的,因为它是同步方法。