So verwenden Sie gleichzeitig BytearrayoutputStream und DataOutputStream (Java)
-
24-10-2019 - |
Frage
Ich habe hier ein ziemliches Problem und ich denke, das liegt daran, dass ich nicht viel verstehe, wie ich die von Java bereitgestellte API verwenden sollte.
Ich muss eine schreiben int
und ein byte[]
in ein byte[]
Ich dachte daran, eine zu verwenden DataOutputStream
Um das Schreiben des Daten zu lösen mit writeInt(int i)
und write(byte[] b)
, und in der Lage sein, das in ein Byte -Array zu bringen, sollte ich verwenden ByteArrayOutputStream
Methode toByteArray().
Ich verstehe, dass diese Klassen das Wrapper -Muster verwenden, also hatte ich zwei Optionen:
DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());
oder
ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());
Aber in beiden Fällen "verliere" ich eine Methode. Im ersten Fall kann ich nicht auf die zugreifen toByteArray()
Methode, und im zweiten kann ich nicht auf die zugreifen writeInt()
Methode.
Wie soll ich diesen Klassen zusammen verwenden?
Lösung
So was:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream w = new DataOutputStream(baos);
w.writeInt(100);
w.write(byteArray);
w.flush();
byte[] result = baos.toByteArray();
Eigentlich funktioniert Ihre zweite Version überhaupt nicht. DataOutputStream
Benötigt einen tatsächlichen Zielstrom, in dem die Daten geschrieben werden können. Du kannst nicht tun new DataOutputStream()
. Es gibt tatsächlich keinen solchen Konstruktor.
Andere Tipps
Könnten Sie eine Variable erstellen, die Sie am BytearrayoutputStream festhalten und in den DataOutputStream weitergeben können.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();
Verwenden Sie den früheren Fall - Wrap DataOutputStream
um die ByteArrayOutputStream
. Stellen Sie einfach sicher, dass Sie den Verweis auf die speichern ByteArrayOutputStream
. Wenn Sie fertig sind () oder zumindest bündig () die DataOutputStream
und dann die Tobytearray -Methode der ByteArrayOutputStream
.
Sie können einen Stream -Ansatz verwenden, wenn Sie Ihren OutputStream über a an einen InputStream anschließen PipedInputStream
/PipetOutputStream
. Anschließend verbrauchen Sie die Daten aus dem InputStream.
Wie auch immer, wenn das, was Sie tun müssen, einfach ist und keinen Stream -Ansatz erfordert, würde ich a verwenden java.nio.ByteBuffer
auf was du hast
put(byte[] src)
für deinbyte[]
putInt(int value)
- und
byte[] array()
Um den Inhalt zu bekommen
Sie brauchen nicht mehr so
Example exampleExample = method(example);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();
Die Ganzzahlklasse verfügt über eine Methode, um den Bytewert eines int zu erhalten.Integer.byteValue()