2010-08-24 12 views
5

Hiho,copia un flusso via byte []

devo copiare un inputstream. E dopo un po 'di ricerche in rete, ho provato questo con l'aiuto di un bytearray. Il mio codice è simile al seguente ("si" è l'InputStream):

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    while (is.read() != -1) { 
     bos.write(is.read()); 
    } 
    byte[] ba = bos.toByteArray(); 

    InputStream test = new ByteArrayInputStream(ba); 
    InputStream test2 = new ByteArrayInputStream(ba); 

E funziona .. quasi

Sia nel torrente, il programma copiato solo ogni secondo carattere Così "DOR A =" 104 "/>" nel flusso "is" diventa: "O = 14 /" negli altri flussi

Qual è il problema? non riesco a capire cosa sta succedendo.

Speranza Qualcuno mi potrebbe dare la soluzione :)

saluti

risposta

6

È necessario assegnare il byte di lettura nella while ciclo per una variabile. Nel tuo codice attuale lo scarti e basta. È corretto:

int b; 
while((b = read()) != -1) { 
    bos.write(b); 
} 

Naturalmente la lettura di singoli byte non è molto efficiente. Dovresti considerare l'uso di array di byte nella tua prossima versione.

+1

Grazie mille! ho capito qual era il problema :) (perché ho usato il metodo di lettura due volte salta due volte) – Graslandpinguin

+0

Non è corretto. Non viene compilato. Non è possibile dichiarare una variabile all'interno di una condizione di tempo. – EJP

+0

@EJP: Allora perché hai eseguito il rollback della correzione (e probabilmente hai scelto di downvotare invece)? – musiKk

16

Questo perché hai ignorato tutti i personaggi strani meno che non fossero -1, chiamando read() due volte in loop. Ecco il modo corretto utilizzando un buffer (si può sintonizzare la dimensione del buffer):

int count; 
byte[] buffer = new byte[8192]; 
while ((count = in.read(buffer)) > 0) 
    out.write(buffer, 0, count); 
Problemi correlati