是否可以清除ByteArrayOutputStream

时间:2016-02-17 07:41:38

标签: java

我们假设我有以下内容:

final ByteArrayOutputStream boas = new ByteArrayOutputStream();
final byte[] sample = {1,2,3,4,5,6,7,8,9,10};
boas.write(sample);

此时byte buf[]中的后备数组boas包含上面的10个字节(和22个填充字节)。

如果我在boas countsize上调用重置,并且所有其他因素都表明它已空,但内部byte buf[]保持不变并已填充。

在没有创建一个全新的ByteArrayOutputStream的情况下,有没有真正清除它?

更一般地说,为什么ByteArrayOutputStream的行为与此类似,而不是清空byte[]

4 个答案:

答案 0 :(得分:8)

ByteArrayOutputStream.reset()州的Javadoc

  

重置此字节数组输出流的count字段   为零,以便输出流中所有当前累积的输出   被丢弃了。输出流可以再次使用,重新使用已经   分配缓冲区空间。

性能方面,重用已分配的缓冲区是有意义的。

如果您想要不同的行为,可以从ByteArrayOutputStream派生一个类并覆盖reset()buf[]count都是受保护的成员,例如,如果您愿意,可以清除buf

答案 1 :(得分:1)

ByteArrayOutputStream没有提供清空byte[] buf的方法。看看the source codebuf无法直接修改。

您可以编写一个继承自ByteArrayOutputStream的类,并添加一个方法来清空buf

答案 2 :(得分:0)

除非你在对你的问题的评论中做其他人所说的话,否则你不能。 检查摊销分析(https://en.wikipedia.org/wiki/Amortized_analysis)。 我想每次擦除内部缓冲存储器的成本对性能都不利。

答案 3 :(得分:-1)

如果你的问题是如何处理旧的遗留代码而不修改它,我理解有一些ByteArrayOutputStream的子类读取受保护的bufcount变量。

鉴于:

  1. JRE作者应该永远不会使变量受到保护(它违反了OO封装的最基本原则)。
  2. 传统代码作者应该正确解释ByteArrayOutputStream API。
  3. 当前程序员(你)应该扔掉所有遗留代码并从头开始写下来。
  4. ......鉴于所有这些要点,我说,我想任何解决问题的快速解决方案都不会造成更大的伤害。

    例如:如果 - 我明白 - 你必须维护一些LegacyOutputStream类作为ByteArrayOutputStream的子类,你能写下你自己的子类吗?

    public class MyFixOutputStream extends LegacyOutputStream
    {
        @Override
        public void reset()
        {
            // Do here with this.buf wathever blunders required by LegacyOutputStream.
        }
    }
    

    ...然后,在现有代码中将LegacyOutputStream替换为MyFixOutputStream