concaténer ByteArrayOutputStream
-
12-10-2019 - |
Question
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;
}
}
Il y a un problème avec le code ci-dessus. Je crée d'abord un objectStream (dans une autre classe). Et puis-je ajouter manuellement RECORDID au ByteArrayOutputStream. Mais est-il un moyen d'ajouter d'abord RECORDID et puis ajoutez le ByteArrayOutputStream à elle? Fondamentalement, j'ai 2 ByteArrayoutputStreams qui doivent être concaténés (et reste un ByteArrayOutputStream).
modifier: Ma nouvelle version devrait fonctionner, mais il ne fonctionne pas. Quand j'imprimer le hashcode de dout, il est le même avant et après la chasse d'eau. Il est comme il reste vide? Est-ce possible?
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;
}
}
La solution
essayez ce qui suit pour placer RECORDID premier.
ByteArrayOutputStream objectStream = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(objectStream);
dout.writeUTF(recordid);
dout.write(dataObject.toByteArrayOutputStream().toByteArray());
Autres conseils
Vous pourriez écrire dataObject
et recordid
dans l'ordre actuel (mal) les faire pivoter alors en place:
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;
}
}