ByteArrayOutputStream 容量限制

ByteArrayOutputStream capacity restriction

我创建了 ByteArrayOutputStream barr = new ByteArrayOutputStream(1);,即容量为 1 个字节并写入超过 1 个字节 barr.write("123456789000000".getBytes());。没有错误发生,我检查barr的长度是15。为什么我的写没有被阻塞或包裹?有没有一种方法可以防止写入超过容量并且可以使用哪个outputstream? 我的可用内存非常有限,不想在那里写超过我的限制定义

P.S. 非常感谢您的回答!我有跟进 要是能看看就好了

那是因为您指定给构造函数的容量是缓冲区的初始大小。如果写入更多数据,缓冲区将自动重新分配更大的大小,以容纳更多数据。

据我所知,ByteArrayOutputStream 无法限制缓冲区的增长。您可以使用其他东西代替,例如 java.nio.ByteBuffer,它具有固定大小。

如果您尝试写入更多字节,

ByteArrayOutputStream 将增加后备数组。这通常被认为是一件好事。

如果您想要不同的行为,您始终可以编写自己的 OutputStream 实现,如果要写入的字节数超出容量,则抛出 IOException。

ByteArrayOutputStream 不是最终的,所以你可以扩展它。我想你所要做的就是重写 write(int)write(byte[], int, int) 以在要写入的字节数大于剩余字节数时抛出异常。 bufcount 字段受到保护,因此您的子类应该能够看到写入了多少后备数组以及数组的长度

我遇到了同样的问题,并最终在 Hadoop 中发现了相同问题的现有实现 - BoundedByteArrayOutputStream.java