Java 是否可以通过tearrayoutputstream清除

Java 是否可以通过tearrayoutputstream清除,java,Java,让我们假设我有以下几点: final ByteArrayOutputStream boas = new ByteArrayOutputStream(); final byte[] sample = {1,2,3,4,5,6,7,8,9,10}; boas.write(sample); 此时,boas中的后备数组byte buf[]包含上面的10个字节(和22个填充字节) 如果我在boas上调用reset,则计数和大小以及所有其他因素表明它为空,但内部字节buf[]保持不变并填充 是否真的可以通

让我们假设我有以下几点:

final ByteArrayOutputStream boas = new ByteArrayOutputStream();
final byte[] sample = {1,2,3,4,5,6,7,8,9,10};
boas.write(sample);
此时,
boas
中的后备数组
byte buf[]
包含上面的10个字节(和22个填充字节)

如果我在
boas
上调用reset,则
计数
大小
以及所有其他因素表明它为空,但内部
字节buf[]
保持不变并填充

是否真的可以通过tearrayoutputstream,在不创建全新的
的情况下,将其清除


更一般地说,ByteArrayOutputStream这样做而不是清空
字节[]
有什么原因吗?

ByteArrayOutputStream
没有提供清空
字节[]buf
的方法。看一看。不能直接修改


您可以编写一个继承自
ByteArrayOutputStream的类,并将一个方法添加到
buf
ByteArrayOutputStream.reset()的Javadoc中

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

就性能而言,重用已分配的缓冲区是有意义的


如果需要不同的行为,可以从
ByteArrayOutputStream
派生类,并重写
reset()
buf[]
count
都是受保护的成员,因此,例如,如果您愿意,您可以清除
buf

不,除非按照其他人在对您问题的评论中所说的做,否则您不能。 检查摊销分析()。
我猜每次擦除内部缓冲区内存的成本都会对性能造成不利影响。

如果您的问题是在不修改旧的遗留代码的情况下处理旧的遗留代码,我知道有一些
ByteArrayOutputStream
的子类读取受保护的
buf
count
变量

鉴于:

  • JRE作者不应该保护变量(它违反了OO封装的最基本原则)
  • 遗留代码作者应该正确地解释了
    ByteArrayOutputStream
    API
  • 现在的程序员(你)可能应该扔掉所有遗留代码,从头开始写下来
  • 。。。考虑到所有这些问题,我说,我想任何简单解决问题的快速解决方案都不会造成更大的伤害

    例如:据我所知,如果您必须维护一些
    LegacyOutputStream
    类作为
    ByteArrayOutputStream
    的子类,您能写下自己的子类吗

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

    。。。然后,将现有代码中使用的
    LegacyOutputStream
    替换为
    MyFixOutputStream

    为什么?您关心内部数据结构中的内容是什么?当你说“所有其他因素”表明字节数组为空时,为什么还要费心遍历它呢?这有什么意义呢?我不认为通常会有很多人需要这样的功能。重置
    BAOS
    仅意味着指针将重置为起始位置,后续添加将覆盖旧数据。是<代码>boas=null并等待(或强制)GC。问题是为什么要这样做。@EJP如果我有一些遗留代码,其中有人没有正确读取javadocs,并且假设reset()实际上重置了byte[]缓冲区,那么我可能非常关心内部数据结构。如果在
    reset()之后,数据是否留在内存中无关紧要
    它的行为就像它是空的一样。感谢您回答这个问题。我猜文档中可以解释的位是“因此输出流中当前累积的所有输出都被丢弃”@imrichardcole discarded必须被解释为:它不会出现在
    toByteArray()
    返回的字节数组中。