2011-01-19 2 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에 추가합니다. 하지만 먼저 레코드를 추가하는 방법이 있습니까? & 다음에 ByteArrayOutputStream을 추가하십시오. 기본적으로 연결된 2 ByteArrayoutputStream 있습니다 (및 ByteArrayOutputStream 남아).Concatenate 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

다음을 시도하여 먼저 recordid를 배치하십시오.

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

writeUTF와 write 사이에 dout.flush()를 사용해 보았습니다. 그러나 recordid가 스트림에 추가되지 않았습니다. S – Vincent

+0

이렇게하면 원본 스트림이 변경되지 않고 데이터를 앞에 추가 할 수 없습니다. –

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

2

방법 writeTo() 당신이 다른 OutputStreamByteArrayOutputStream의 내용을 추가 할 것입니다.

+0

이 방법은 J2ME에는 없습니다. http://download.oracle.com/javame/config/cldc/ref-impl/ cldc1.1/jsr139/java/io/ByteArrayOutputStream.html – BalusC

+0

@BalusC J2ME인지 어떻게 알 수 있습니까? J2ME에서는'baos1.write (baos2.toByteArray(), 0, baos2.toByteArray(). length); ' – biziclop

+0

OP가 명시 적으로 주석 처리했습니다. – 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; 
    } 
} 
관련 문제