2010-08-24 5 views
5

Hiho,copier un flux par octet []

Je dois copier un flux d'entrée. Et après un peu de recherche dans le filet, j'ai essayé cela avec l'aide d'un bytearray. Mon code ressemble à ceci ("est" est le 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); 

Et ça marche .. presque

Dans les deux flux, le programm copié que chaque second caractère donc "DOR A =" 104 "/" ​​"dans le flux" est "devient: " O = 14/" dans les autres flux

Quel est le problème? Je ne peux pas comprendre ce qui se passe.

personne Hope pourrait me donner la solution :)

salutations

Répondre

6

Vous devez attribuer l'octet de lecture dans la boucle while à une variable. Dans votre code actuel, il vous suffit de le supprimer. Ce qui suit est correct:

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

Bien sûr, la lecture des octets uniques n'est pas très efficace. Vous devriez envisager d'utiliser des tableaux d'octets dans votre prochaine version.

+1

Merci beaucoup! je comprends quel était le problème :) (parce que j'ai utilisé la méthode de lecture deux fois, il saute deux fois) – Graslandpinguin

+0

Ce n'est pas correct. Il ne compile pas. Vous ne pouvez pas déclarer une variable dans une condition while. – EJP

+0

@EJP: Alors pourquoi avez-vous annulé votre correction (et vous avez probablement choisi de la réduire)? – musiKk

16

C'est parce que vous avez ignoré tous les personnages bizarres à moins qu'ils étaient -1, en appelant read() deux fois dans votre boucle. Voici la manière correcte à l'aide d'un tampon (vous pouvez régler la taille de la mémoire tampon):

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