2011-01-19 39 views
3
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)。Concatenate ByteArrayOutputStream

编辑: 我的新版本应该可以工作,但它不会。当我打印出dout的散列码时,在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; 
     } 
    } 

回答

4

请尝试以下操作先放置recordid。

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

我不知道是什么的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(); 
+1

供您参考,API文档是JSR139:http://download.oracle。 com/javame/config/cldc/ref-impl/cldc1.1/jsr139/index.html – BalusC 2011-01-19 13:26:04

2

方法writeTo()会让你一个ByteArrayOutputStream的内容附加到任何其他OutputStream

+0

此方法在J2ME中不存在:http://download.oracle.com/javame/config/cldc/ref-impl/ cldc1.1/jsr139/java/io/ByteArrayOutputStream.html – BalusC 2011-01-19 13:26:55

+0

@BalusC我怎么知道它是J2ME?在J2ME中,您可以简单地说`baos1.write(baos2.toByteArray(),0,baos2.toByteArray()。length);` – biziclop 2011-01-19 13:29:06

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; 
    } 
}