假设我有以下内容:
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 count
和size
,所有其他因素都表明它是空的,但在内部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
读取受保护的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
?