155 votes

Lire le flux deux fois

Comment lisez-vous le même flux d'entrée deux fois? Est-il possible de le copier en quelque sorte?

Je dois obtenir une image sur le Web, la sauvegarder localement, puis renvoyer l'image enregistrée. Je pensais qu'il serait plus rapide d'utiliser le même flux au lieu de créer un nouveau flux avec le contenu téléchargé, puis de le relire.

147voto

Paul Grime Points 10202

Vous pouvez utiliser org.apache.commons.io.IOUtils.copy pour copier le contenu de l'InputStream à un tableau d'octets, et ensuite à plusieurs reprises de lire à partir du tableau d'octets à l'aide d'un ByteArrayInputStream. E. g.:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
org.apache.commons.io.IOUtils.copy(in, baos);
byte[] bytes = baos.toByteArray();

// either
while (needToReadAgain) {
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    read(bais);
}

// or
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
while (needToReadAgain) {
    bais.reset();
    read(bais);
}

37voto

Kevin Points 4235

Selon l'endroit où l'InputStream est à venir à partir de, vous pourriez ne pas être en mesure de le réinitialiser. Vous pouvez vérifier si mark() et reset() sont pris en charge à l'aide de markSupported().

Si elle l'est, vous pouvez appeler reset() sur le InputStream pour revenir au début. Si non, vous devez lire l'InputStream à partir de la source de nouveau.

17voto

wannas Points 46

si votre InputStream charge l'utilisation de la marque, alors vous pouvez l' mark() votre inputStream et puis, reset() il . si votre InputStrem ne supporte pas la marque, alors vous pouvez utiliser la classe java.io.BufferedInputStream,de sorte que vous pouvez intégrer vos flux à l'intérieur d'un BufferedInputStream comme ceci

    InputStream bufferdInputStream = new BufferedInputStream(yourInputStream);
    bufferdInputStream.mark(some_value);
    //read your bufferdInputStream 
    bufferdInputStream.reset();
    //read it again

6voto

alain.janinm Points 7597

Si vous utilisez une mise en oeuvre de l'interface InputStream, vous pouvez vérifier le retour de l' InputStream#markSupported() peut vous dire si oui ou non vous pouvez utiliser la méthode mark() / reset(). Si vous pouvez marquer le ruisseau quand vous lisez, puis d'appeler reset() pour revenir à commencer.

2voto

Maneesh Points 3325

Convertir inputstream en octets et puis la passer à savefile fonction de l'endroit où vous assemblez le même dans inputstream. Également en fonction d'origine de l'utilisation d'octets à utiliser pour d'autres tâches

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X