【问题标题】:Concatenate ByteArrayOutputStream连接 ByteArrayOutputStream
【发布时间】:2011-01-19 13:15:16
【问题描述】:
public byte[] toByteArray() {
    try {
        ByteArrayOutputStream objectStream = dataObject.toByteArrayOutputStream();
        DataOutputStream dout = new DataOutputStream(objectStream);
        dout.writeUTF(recordid);    

        dout.close();
        objectStream.close();
        return objectStream.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

上面的代码有问题。我首先创建了一个 objectStream(在另一个类中)。然后我手动将 recordid 添加到 ByteArrayOutputStream。但是有没有办法先添加recordId然后将ByteArrayOutputStream附加到它?基本上我有 2 个 ByteArrayoutputStreams 需要连接(并且仍然是 ByteArrayOutputStream)。

编辑: 我的新版本应该可以工作,但不能。当我打印出dout的hashcode时,它在flush之前和之后是一样的。好像一直是空的?这可能吗?

public byte[] toByteArray() {
        try {

            ByteArrayOutputStream realOutputStream = new ByteArrayOutputStream();
            DataOutputStream dout = new DataOutputStream(realOutputStream);
            dout.writeUTF(dataObject.getClass().toString());
            dout.writeUTF(recordid);
            System.out.println("Recordid: " + recordid + "|" +  dout.hashCode());
            dout.flush();
            System.out.println("Recordid: " + recordid + "|" +  dout.hashCode());

            ByteArrayOutputStream objectStream = dataObject.toByteArrayOutputStream();
            dout.write(objectStream.toByteArray());

            dout.close();
            objectStream.close();
            return objectStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    } 

【问题讨论】:

    标签: java java-me outputstream bytearrayoutputstream


    【解决方案1】:

    尝试以下方法将recordid放在第一位。

    ByteArrayOutputStream objectStream = new ByteArrayOutputStream();
    DataOutputStream dout = new DataOutputStream(objectStream);
    dout.writeUTF(recordid);    
    dout.write(dataObject.toByteArrayOutputStream().toByteArray());
    

    【讨论】:

    • 我已经尝试过了(即使在 writeUTF 和 write 之间使用了 dout.flush()。但是 recordid 没有添加到流中:S
    • 这不会改变原始流,您不能在其中添加数据。
    【解决方案2】:

    writeTo() 方法可以让您将ByteArrayOutputStream 的内容附加到任何其他OutputStream

    【讨论】:

    • @BalusC 我怎么知道它是 J2ME?在 J2ME 中,您可以简单地说 baos1.write( baos2.toByteArray(), 0, baos2.toByteArray().length );
    • OP 明确评论了它。
    • @BalusC 是的,不过比我开始写答案要晚一点。 OP没有在问题中提到它,也没有正确标记它。
    【解决方案3】:

    我不知道ByteArrayOutputStream在J2ME上的API是什么样的,但是试试:

    ByteArrayOutputStream realOutput = new ByteArrayOutputStream();
    DataOutputStream dout = new DataOutputStream(realOutput);
    dout.writeUTF(recordid);
    dout.flush();
    
    ByteArrayOutputStream objectStream = dataObject.toByteArrayOutputStream();
    objectStream.writeTo(realOutput);
    
    return realOutput.toByteArray();
    

    【讨论】:

    【解决方案4】:

    您可以按当前(错误)顺序编写dataObjectrecordid,然后将它们旋转到位:

    public byte[] toByteArray() {
        try {
            ByteArrayOutputStream objectStream = dataObject.toByteArrayOutputStream();
            int pos = objectStream.size();
            DataOutputStream dout = new DataOutputStream(objectStream);
            dout.writeUTF(recordid);    
            dout.close();
            objectStream.close();
            byte[] array = return objectStream.toByteArray();
            rotate(array, pos);
            return array;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    private static void rotate(byte[] array, int pos) {
        reverse(array, 0, pos);
        reverse(array, pos, array.length);
        reverse(array, 0, array.length);
    }
    
    private static void reverse(byte[] array, int start, int end) {
        while (start < --end) {
            byte t = array[start];
            array[start] = array[end];
            array[end] = t;
            ++ start;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多