我创建ByteArrayOutputStream barr = new ByteArrayOutputStream(1);,即容量为1字节,并向其写入超过1字节的barr.write("123456789000000".getBytes());。没有发生错误,我检查barr的长度它是15。为什么我的写作没有被阻止或包装?是否有一种方法可以防止编写超出容量的内容,而哪一种outputstream可用于此?我的可用内存非常有限,我不想写得比我定义的更多。
P.S.非常感谢你的回答!我对问题做了跟踪,如果你能看的话
发布于 2015-10-08 14:17:46
这是因为您为构造函数指定的容量是缓冲区的初始大小。如果您写入更多的数据,缓冲区将自动重新分配更大的大小,以适应更多的数据。
据我所知,ByteArrayOutputStream无法限制缓冲区的增长。您可以使用其他的东西,例如java.nio.ByteBuffer,它有固定的大小。
发布于 2015-10-08 14:18:12
如果您尝试编写更多的字节,ByteArrayOutputStream将生成支持数组。这通常被认为是一件好事。
如果您想要不同的行为,您可以编写自己的OutputStream实现,如果要写入的字节数超过了容量,就会抛出一个IOException。
ByteArrayOutputStream不是最终的,所以您可以扩展它。我认为,如果要写入的字节数大于剩余的字节数,则只需重写write(int)和write(byte[], int, int)就可以抛出异常。字段buf和count受到保护,因此您的子类应该能够看到支持数组的写入量和数组的长度。
发布于 2017-04-21 05:25:17
我也遇到了同样的问题,并最终在Hadoop - BoundedByteArrayOutputStream.java中找到了一个现有的实现。
https://stackoverflow.com/questions/33018341
复制相似问题