连接ByteArrayOutputStream

5
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附加到其上?我基本上有两个需要连接的ByteArrayoutputStreams(并保持为ByteArrayOutputStream)。
编辑: 我的新版本应该可以工作,但是它没有。当我打印dout的哈希码时,刷新前后相同。就好像它保持为空?这是可能的吗?
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;
        }
    } 
4个回答

5
尝试以下方法将记录ID放在首位。
ByteArrayOutputStream objectStream = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(objectStream);
dout.writeUTF(recordid);    
dout.write(dataObject.toByteArrayOutputStream().toByteArray());

我已经尝试过这个(甚至在writeUTF和write之间加上dout.flush())。但是recordid没有被添加到流中:S - Vincent
这不会改变原始流,您无法在其前面添加数据。 - Peter Lawrey

2

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


1
这个方法在J2ME中不存在:http://download.oracle.com/javame/config/cldc/ref-impl/cldc1.1/jsr139/java/io/ByteArrayOutputStream.html - BalusC
@BalusC 我怎么知道这是J2ME?在J2ME中,你可以简单地说 baos1.write( baos2.toByteArray(), 0, baos2.toByteArray().length ); - biziclop
OP明确地进行了评论。 - BalusC
@BalusC 是的,比我开始写答案晚了一点。原帖中没有提到这一点,也没有正确标记。 - biziclop

0

我不知道 J2ME 上 ByteArrayOutputStream 的 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();

1
供您参考,API文档在JSR139中:http://download.oracle.com/javame/config/cldc/ref-impl/cldc1.1/jsr139/index.html - BalusC

0

您可以先以当前(错误的)顺序编写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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接