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()
返回的字节数组中。