ByteArrayOutputStream容量限制

时间:2015-10-08 14:14:21

标签: java outputstream capacity

我创建ByteArrayOutputStream barr = new ByteArrayOutputStream(1);,即容量为1个字节,并向其写入超过1个字节barr.write("123456789000000".getBytes());。没有错误发生,我检查barr的长度为15.为什么我的写作没有被阻止或包裹?有没有办法防止写入超过容量,哪些outputstream可用于此? 我的可用内存非常有限,并且不想在那里写出比我的限制更多的内容

P.S。 非常感谢您的回答!我有一个跟进question 如果你看起来可能会很棒

3 个答案:

答案 0 :(得分:4)

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

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

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

ByteArrayOutputStream不是最终的,所以你可以扩展它。我认为你所要做的就是覆盖write(int)write(byte[], int, int),如果要写入的字节数超过剩余的数量,则抛出异常。字段bufcount受到保护,因此您的子类应该能够看到写入了多少支持数组以及数组的长度

答案 1 :(得分:2)

我遇到了同样的问题,最终在Hadoop中找到了同一件事的现有实现 - BoundedByteArrayOutputStream.java

答案 2 :(得分:1)

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

据我所知,ByteArrayOutputStream无法限制缓冲区的增长。您可以使用其他内容,例如java.nio.ByteBuffer,其大小固定。