因此,我的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());
我认为这不是正确的方法,有人有任何建议吗?
答案 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
}
}