2010-08-24 3 views
5

Hiho,Kopieren eines Streams über Byte []

Ich muss einen Eingabestream kopieren. Und nach ein bisschen Suchen im Netz habe ich das mit Hilfe eines Bytearrays versucht. Mein Code sieht wie folgt aus ("ist" die Input):

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); 

Und es funktioniert .. fast

Sowohl in der Strom, das Programm nur jedes zweite Zeichen kopiert So "DOR A =" 104 "/>" im "is" -Stream wird: "O = 14 /" in den anderen Streams

Was ist das Problem? Ich kann nicht verstehen, was vorgeht.

Hoffnung jemand könnte mir die Lösung :)

Grüße

Antwort

6

Sie haben das Lese Byte in der while Schleife zu einer Variablen zuzuweisen. In Ihrem aktuellen Code verwerfen Sie es einfach. Folgendes ist richtig:

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

Natürlich ist das Lesen einzelner Bytes nicht sehr effizient. Sie sollten in Ihrer nächsten Version die Verwendung von Byte-Arrays in Betracht ziehen.

+1

Vielen Dank! Ich verstehe, was das Problem war :) (weil ich die Lese-Methode zweimal verwendet es zweimal springt) – Graslandpinguin

+0

Es ist nicht korrekt. Es kompiliert nicht. Sie können eine Variable nicht innerhalb einer while-Bedingung deklarieren. – EJP

+0

@EJP: Warum haben Sie dann Ihre Korrektur rückgängig gemacht (und wahrscheinlich stattdessen einen Downvote gewählt)? – musiKk

16

Das ist, weil Sie alle ungeraden Zeichen ignoriert, wenn sie -1 waren, durch() zweimal in der Schleife lesen aufrufen. Hier ist der richtige Weg, einen Puffer (Sie können tune die Puffergröße) mit:

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