【问题标题】:How can I remove bytes from a ByteArrayOutputStream?如何从 ByteArrayOutputStream 中删除字节?
【发布时间】:2023-03-09 06:48:01
【问题描述】:

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

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

【问题讨论】:

  • 如果以后需要删除它们,为什么还要将它们写入流?只是不要一开始就写它们。
  • @JB Nizet - 我确实需要它们我只是省略了很多代码以使事情更容易理解。一旦我使用它们,虽然我需要删除它们。
  • @Grammin:你没有让事情变得更容易理解——你让它们变得完全难以理解。根本不清楚您要做什么。
  • ByteArrayOutputStream 的目标是生成一个字节数组。如果您不希望最终字节数组中的标头长度,则不应将其写入输出流。如果您想要字节数组中的标头长度,则无需删除任何内容。你到底想达到什么目标?
  • 当你使用OutputStream的结果时,你可以跳过第一个N字节。例如write(oStream.toByteArray(), 4, length-4)

标签: java bytearrayoutputstream


【解决方案1】:

简单的答案是首先写入 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 等时执行此操作。

【讨论】:

    【解决方案2】:

    没有办法按照您的要求去做。
    您必须使用 remove 方法发明自己的 OutputStream。
    我建议这个 OutputStream 将接受另一个 OutputStream 作为参数,并且当您执行写入时,它会累积字节(使用与 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
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2015-05-05
      • 2023-03-06
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多