2014-11-16 27 views
12

Ich versuche, einen OutputStream in einen ByteArrayOutput Stream zu konvertieren. Ich konnte keine klaren, einfachen Antworten finden, wie das geht. Diese Frage wurde im Titel der Frage zu StackOverflow gestellt, aber der Hauptteil der Frage lautet wie man einen ByteArrayStream zu OuputStream ändert. Ich habe eine OutputStream, die bereits erstellt wurde und dieses Beispiel in der Antwort wird nicht kompilieren!OutputStream in ByteArrayOutputStream konvertieren

That Question is Here

Ich habe eine Outputstream, die bereits aufgebaut ist, und hat eine Länge von 44 Byte genannt waveHeader. Ich möchte das in einen ByteArrayOutputStream konvertieren, weil ich das in ein Byte [] mit waveHeader.ToByteArray() für die Einfachheit in späteren Prozessen ändern möchte;

Gibt es eine einfache Art von Casting oder etwas, das dies erlaubt?

Wenn nicht, dann:

  • Gibt es eine Möglichkeit, einen Zeiger auf die Daten in dem ursprünglichen Output zu konstruieren, wenn es nicht möglich ist, es zu konvertieren?

  • Wie würde jemand auf die Daten zugreifen, die im OutputStream enthalten sind?

Ich bin neu in JAVA. Das ist nur ein Hobby für mich. Streams in VisualBasic .net, wo viel einfacher!

+1

Ich dachte nicht, dass es notwendig war, irgendeinen Code zu posten. –

+0

Unklare Antwort! Lesen Sie die ganze Frage bitte. Dieses Beispiel wird nicht kompiliert! –

+1

Der Code, der diese 44 Bytes schreibt, muss zuerst an Ihren ByteArrayOutputStream schreiben. Der Code ist nicht bewusst, dass er in ein BAOS schreibt, es reicht aus, wenn es auf der OS-Klasse beruht. – eckes

Antwort

21

Es gibt mehrere mögliche Szenarien:

a) Sie haben eine ByteArrayOutputStream, aber es wurde als Output erklärt. Dann können Sie eine Besetzung wie folgt tun:

void doSomething(OutputStream os) 
{ 
    // fails with ClassCastException if it is not a BOS 
    ByteArrayOutputStream bos = (ByteArrayOutputStream)os; 
... 

b) wenn Sie irgendeine andere Art von Ausgabestrom haben, ist es nicht wirklich Sinn machen es zu einem BOS zu konvertieren. (Sie möchten es normalerweise umwandeln, weil Sie auf das Ergebnis-Array zugreifen möchten). In diesem Fall kannst du einfach einen neuen Stream erstellen und verwenden.

void doSomething(OutputStream os) 
{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    bos.write(something); 
    bos.close(); 
    byte[] arr = bos.toByteArray(); 
    // what do you want to do? 
    os.write(arr); // or: bos.writeTo(os); 
... 

c) Wenn Sie etwas für jede Art von Outputstream geschrieben haben (was Sie nicht wissen, was es ist, zum Beispiel weil Sie es von einem Servlet) bekommen, gibt es keine Möglichkeit, diese Informationen zurück zu bekommen. Sie müssen nicht etwas schreiben, das Sie später brauchen. Eine Lösung ist die Antwort b) wo Sie es in Ihrem eigenen Stream schreiben, und dann können Sie das Array für Ihren eigenen Zweck verwenden und es in den tatsächlichen Ausgabestrom schreiben.

Denken Sie daran, ByteArrayOutputStreams behalten alle Daten im Speicher.

+0

Sehr gute Antwort. Vielen Dank. –

+0

Hmmm .... es gibt etwas über Streams in Java, die ich einfach nicht verstehe. Warum sollte ein OutputStream (der einzige Typ, in den geschrieben werden kann) nicht auf die Daten zugreifen können? Sollten sie NIEMALS als Variable verwendet werden, um irgendwelche Daten zu speichern, die später ausgegeben werden? Ich arbeite an einem Audio-Projekt und die meisten Dinge scheinen OutputStreams auf die eine oder andere Weise zu verwenden. Ich habe Code in der Android-API gefunden, der einen Wave-Dateiheader, nur den Header, als OutputStream erstellt. –

+0

Nachdem ich darüber nachgedacht habe, könnte man OutputStreams anhängen, um Daten zu konstruieren, die schließlich zu einem InputStream gelangen ??? Ich werde über Streams und wie man sie richtig verwendet lesen. –

6

Sie könnten die writeTo Methode von ByteArrayOutputStream verwenden.

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
byte[] bytes = new bytes[8]; 
bos.write(bytes); 
bos.writeTo(oos); 

Sie können eine Instanz von ByteArrayOutputStream erstellen. Sie müssen dann die Daten in diese ByteOutputStream Instanz schreiben und dann mit der writeTo Methode, die eine OutputStream akzeptiert, können Sie die ByteArrayOutputStream aktivieren, um die Ausgabe in die Instanz von OutputStream, die Sie als Argument übergeben haben schreiben.

+0

Ich werde es versuchen. –

+0

Ich habe meinen Kommentar bearbeitet. :) Vielen Dank! Ich werde es versuchen. –

+2

nein, das wird "nichts" schreiben (die bos ist leer) zu oos. – eckes

-1

Sie können toByteArray Funktion auf den Ausgangsstrom verwenden, den Sie haben.Das ist sagen wir haben outputStream buffer So können Sie buffer.toByteArray tun.

Für mehr können Sie die Antwort von Convert InputStream to byte array in Java betrachten.

+0

Das OP möchte einen ByteArrayOutputStream von einem OutputStream erstellen, Sie verwenden einen InputStream! – Charlie

+3

Reguläre outputStreams haben keine tobytearray-Methode. –

+0

Ich habe einen Blick auf diese https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html, wo es zuByteArray-Methode zeigt. Bitte gehen Sie es einmal durch. – cauchy