是否可以清除字节数组输出流



假设我有以下内容:

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

此时,boasbyte buf[]的后备阵列包含上述 10 个字节(和 22 个填充字节(。

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

有没有办法在不创建一个全新的ByteArrayOutputStream的情况下真正清除这一点?

更一般地说,ByteArrayOutputStream的行为是这样的而不是清空byte[]的原因吗?

ByteArrayOutputStream.reset()州的Javadoc

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

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

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

ByteArrayOutputStream没有提供清空byte[] buf的方法。看看源代码。 buf不能直接修改。

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

不,除非按照别人在评论你的问题时说的话去做,否则你不能这样做。检查摊销分析(https://en.wikipedia.org/wiki/Amortized_analysis(。我想每次擦除内部缓冲区内存的成本对性能不利。

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

鉴于:

  1. JRE 作者应该从未保护过变量(它违反了 OO 封装的最基本原则(。
  2. 旧代码作者应该正确解释ByteArrayOutputStream API。
  3. 当前的程序员(你(可能应该扔掉所有的遗留代码,从头开始写下来。

。鉴于所有这些要点,我说,我想任何轻松解决问题的快速解决方案都不会造成更大的伤害。

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

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

。然后,替换现有代码中任何对LegacyOutputStream的使用 MyFixOutputStream

最新更新