我们假设我有以下内容:
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
count
和size
上调用重置,并且所有其他因素都表明它已空,但内部byte buf[]
保持不变并已填充。
在没有创建一个全新的ByteArrayOutputStream
的情况下,有没有真正清除它?
更一般地说,为什么ByteArrayOutputStream的行为与此类似,而不是清空byte[]
?
答案 0 :(得分:8)
ByteArrayOutputStream.reset()
州的Javadoc
重置此字节数组输出流的
count
字段 为零,以便输出流中所有当前累积的输出 被丢弃了。输出流可以再次使用,重新使用已经 分配缓冲区空间。
性能方面,重用已分配的缓冲区是有意义的。
如果您想要不同的行为,可以从ByteArrayOutputStream
派生一个类并覆盖reset()
。 buf[]
和count
都是受保护的成员,例如,如果您愿意,可以清除buf
。
答案 1 :(得分:1)
ByteArrayOutputStream
没有提供清空byte[] buf
的方法。看看the source code。 buf
无法直接修改。
您可以编写一个继承自ByteArrayOutputStream
的类,并添加一个方法来清空buf
。
答案 2 :(得分:0)
除非你在对你的问题的评论中做其他人所说的话,否则你不能。 检查摊销分析(https://en.wikipedia.org/wiki/Amortized_analysis)。 我想每次擦除内部缓冲存储器的成本对性能都不利。
答案 3 :(得分:-1)
如果你的问题是如何处理旧的遗留代码而不修改它,我理解有一些ByteArrayOutputStream
的子类读取受保护的buf
和count
变量。
鉴于:
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
?