【问题标题】:ByteArrayOutputStream capacity restrictionByteArrayOutputStream 容量限制
【发布时间】:2015-10-08 14:14:20
【问题描述】:

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

附言 非常感谢您的回答!我有一个跟进question 如果你能看,那就太好了

【问题讨论】:

  • 根据 Javadoc,“缓冲区会随着数据写入而自动增长。” Reference
  • 即 - 给定的容量是初始容量?
  • 正确 - 构造函数中的 int 参数只是数组缓冲区的初始大小。

标签: java outputstream capacity


【解决方案1】:

ByteArrayOutputStream 如果您尝试写入更多字节,则会增加后备数组。这通常被认为是一件好事。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多