2

因此,我的 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());

我认为这不是解决此问题的正确方法,有人有什么建议吗?

4

2 回答 2

4

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

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

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

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

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

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

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

于 2012-06-27T13:26:09.017 回答
1

没有办法做你所要求的。
您必须使用 remove 方法发明自己的 OutputStream。
我建议这个 OutputStream 将接受另一个 OutputStream 作为参数,并且当您执行写入时,它将累积字节(使用与 ByteArrayOutputStream 类似的技术)
删除后,您将可以访问您的内部数据结构(比如说数组)和将编写删除算法(例如 - 从数组中删除 M 条目,从位置 N 开始)。
另一种选择是扩展 ByteArrayOutputStream - 我刚刚检查了它的代码,结果发现内部缓冲区是受保护的(该字段名为“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
   }
}
于 2012-06-27T13:25:32.200 回答