2014-11-16 11 views
12

Sto provando a convertire uno OutputStream in un flusso ByteArrayOutput. Non sono riuscito a trovare risposte chiare e semplici su come farlo. Questa domanda è stata posta nel titolo della domanda su StackOverflow, ma il corpo della domanda aske come cambiare un ByteArrayStream a OuputStream. Ho uno OutputStream che è già stato creato e questo esempio dato nella risposta non verrà compilato!Converti OutputStream in ByteArrayOutputStream

That Question is Here

Ho un OutputStream che è già costruito e ha una lunghezza di 44 byte chiamato waveheader. Voglio convertirlo in un ByteArrayOutputStream perché voglio essere in grado di cambiarlo in un byte [] con waveHeader.ToByteArray() per semplicità nei processi successivi;

C'è un tipo di casting semplice o qualcosa che lo consenta?

Se poi non:

  • C'è un modo per costruire un puntatore ai dati nel OutputStream originale, se non è possibile convertirlo?

  • In che modo procederebbe l'accesso ai dati contenuti in OutputStream?

Sono nuovo di JAVA. Questo è solo un hobby per me. Stream In VisualBasic .net dove molto più facile!

+1

Non pensavo fosse necessario pubblicare alcun codice. –

+0

Risposta non chiara! Leggi l'intera domanda per favore. Questo esempio non verrà compilato! –

+1

Il codice che scrive quei 44 byte deve scrivere sul ByteArrayOutputStream in primo luogo. Il codice non si rende conto che sta scrivendo su un BAOS, è sufficiente se si basa sulla classe OS. – eckes

risposta

21

Ci sono molteplici scenari possibili:

a) Si dispone di un ByteArrayOutputStream, ma è stato dichiarato come OutputStream. Poi si può fare un cast come questo:

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

b) se si dispone di qualsiasi altro tipo di flusso di uscita, in realtà non ha senso per convertirlo in un BOS. (In genere si desidera eseguire il cast, perché si desidera accedere alla matrice dei risultati). Quindi in questo caso è semplice impostare un nuovo stream e usarlo.

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) Se avete scritto qualcosa a qualsiasi tipo di OutputStream (che non si sa di cosa si tratta, ad esempio, perché si ottiene da un servlet), non v'è alcun modo per ottenere quelle informazioni indietro. Non devi scrivere qualcosa di cui hai bisogno in seguito. Una soluzione è la risposta b) in cui la si scrive nel proprio stream e quindi è possibile utilizzare l'array per i propri scopi e scriverlo nel flusso di output effettivo.

Tenere presente ByteArrayOutputStreams mantenere tutti i dati in memoria.

+0

Ottima risposta. Grazie. –

+0

Hmmm .... c'è qualcosa sugli stream in Java che non sto capendo. Perché un OutputStream (che è l'unico tipo che può essere scritto su) e non essere in grado di accedere ai dati all'interno? Non dovrebbero MAI essere usati come variabili per contenere qualsiasi tipo di dati che saranno inviati in uscita in seguito? Sto lavorando a un progetto Audio e molte cose sembrano utilizzare OutputStreams in un modo o nell'altro. Ho trovato un codice nell'API di Android che crea un'intestazione di file wave, solo l'intestazione, come OutputStream. –

+0

Dopo averci pensato, immagino che potresti aggiungere OutputStreams per costruire dati che alla fine andranno a un InputStream ??? Leggerò i flussi e come usarli correttamente. –

6

È possibile utilizzare il metodo writeTo di ByteArrayOutputStream.

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

È possibile creare un'istanza di ByteArrayOutputStream. È quindi necessario scrivere i dati in questa istanza ByteOutputStream e quindi utilizzando il metodo writeTo, che accetta uno OutputStream, è possibile abilitare lo ByteArrayOutputStream per scrivere l'output, nell'istanza di OutputStream che è stata passata come argomento.

+0

Farò un tentativo. –

+0

Ho modificato il mio commento. :) Grazie! Ci proverò. –

+2

no, questo scriverà "niente" (il bos è vuoto) su oos. – eckes

-1

È possibile utilizzare la funzione toByteArray sul flusso di output che si ha.Questo significa che hai buffer di outputStream, quindi puoi fare buffer.toByteArray.

Per ulteriori informazioni, consultare la risposta di Convert InputStream to byte array in Java.

+0

L'OP vuole rendere ByteArrayOutputStream da un OutputStream, stai usando un InputStream! – Charlie

+3

Output regolare Gli stream non hanno il metodo tobytearray. –

+0

Ho dato un'occhiata a questo https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html dove mostra il metodo toByteArray. Passare attraverso una volta. – cauchy

Problemi correlati