如何从ByteArrayOutputStream中删除字节?

时间:2012-06-27 13:13:10

标签: java bytearrayoutputstream

因此,我的ByteArrayOutputStream的前四个字节包含流中标头的长度。我需要从流中删除该标头并继续我的业务。

ByteArrayOutputStream oStream = new ByteArrayOutputStream();
/* populate ByteArrayOutputStream */

//grab first int
int headerLength = oStream.toByteArray()[4];

//remove headerLength
String newString = oStream.toString().substring(jsonLength, oStream.size());
oStream.write(newString.getBytes());

我认为这不是正确的方法,有人有任何建议吗?

2 个答案:

答案 0 :(得分:4)

简单的答案是首先写下4个字节......如果你能做到的话。

另一个答案是编写一个自定义FilterOutputStream子类,忽略写入的前4个字节。

另一个是提取字节,然后使用其中一个Arrays.copy方法创建一个新的字节数组,其中包含您需要的原始“切片”; e.g。

byte[] subarray = Arrays.copyOfRange(original, 4, original.length - 4);

或者,如果您的应用程序可以处理字节数组末尾的“未定义”区域,您可以执行以下操作:

System.arraycopy(array, 4, array.length - 4, array, 0);  // YMMV - check javadoc

最后,根据您使用字节数组的内容,您很有可能忽略前4个字节而不删除它们。例如,您可以在将字节写入流时,从字节创建字符串,将字节复制到ByteBuffer等时执行此操作,等等。

答案 1 :(得分:1)

没有办法做你要问的事。
您必须使用remove方法创建自己的OutputStream。
我建议这个OutputStream接受另一个OutputStream作为参数,当你执行write时,它会累积字节(使用与ByteArrayOutputStream类似的技术) 删除后,您将可以访问内部数据结构(比如数组)并编写一个删除算法(例如 - 从数组中删除M个条目,从位置N开始)。
另一个选择是扩展ByteArrayOutputStream - 我只检查了它的code,结果证明内部缓冲区受到保护(该字段名为“buf”) - 所以在此实现我的上述建议。代码看起来应该是(不提供完整代码):

public class MyByteArrayOutputStream extends ByteArrayOutputStream {
   //Implement all the CTORs

   public int remove (int startFrom, int length)  {
       //Implement removal algorithm on array on the field "buf" 
       //return the number of removed elements
   }
}