我创建ByteArrayOutputStream barr = new ByteArrayOutputStream(1);
,即容量为1个字节,并向其写入超过1个字节barr.write("123456789000000".getBytes());
。没有错误发生,我检查barr
的长度为15.为什么我的写作没有被阻止或包裹?有没有办法防止写入超过容量,哪些outputstream
可用于此?
我的可用内存非常有限,并且不想在那里写出比我的限制更多的内容
P.S。 非常感谢您的回答!我有一个跟进question 如果你看起来可能会很棒
答案 0 :(得分:4)
ByteArrayOutputStream
将增加后备数组。这通常被认为是一件好事。
如果您想要不同的行为,您可以随时编写自己的OutputStream
实现,如果要写入的字节数超出容量,则会抛出IOException。
ByteArrayOutputStream
不是最终的,所以你可以扩展它。我认为你所要做的就是覆盖write(int)
和write(byte[], int, int)
,如果要写入的字节数超过剩余的数量,则抛出异常。字段buf
和count
受到保护,因此您的子类应该能够看到写入了多少支持数组以及数组的长度
答案 1 :(得分:2)
我遇到了同样的问题,最终在Hadoop中找到了同一件事的现有实现 - BoundedByteArrayOutputStream.java
答案 2 :(得分:1)
这是因为您为构造函数指定的容量是缓冲区的初始大小。如果您写入更多数据,缓冲区将自动重新分配更大的数据,以适应更多数据。
据我所知,ByteArrayOutputStream
无法限制缓冲区的增长。您可以使用其他内容,例如java.nio.ByteBuffer
,其大小固定。