426 votes

Java - conversion de OutputStream InputStream

Je suis sur le stade de développement, où j’ai deux modules et de celle que j’ai obtenu sortie comme un OutputStream et une deuxième qui accepte seulement d’inputStream. Savez-vous comment convertir OutputStream InputStream (pas l’inverse, je veux dire vraiment ça) que je serai en mesure de relier ces deux parties ?

Merci

291voto

mikeho Points 310

Il semble y avoir beaucoup de liens et d'autres trucs, mais pas de code à l'aide de tuyaux. L'avantage de l'utilisation d' java.io.PipedInputStream et java.io.PipedOutputStream c'est qu'il n'y a pas d'augmentation de la consommation de mémoire. ByteArrayOutputStream.toByteArray() renvoie une copie de l'original de la mémoire tampon, ce qui signifie que tout ce que vous avez en mémoire, vous disposez maintenant de deux copies. Puis, par écrit à l' InputStream signifie que vous avez maintenant trois copies des données.

Le code:

// take the copy of the stream and re-write it to an InputStream
PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
new Thread(
        new Runnable() {
            public void run () {
                try {
                    // write the original OutputStream to the PipedOutputStream
                    originalOutputStream.writeTo(out);
                }
                catch (IOException e) {
                    // logging and exception handling should go here
                }
            }
        }
).start();

Ce code suppose que l' originalOutputStream est ByteArrayOutputStream comme c'est généralement le seul utilisable flux de sortie, sauf si vous êtes en écriture à un fichier. J'espère que cela aide! La grande chose à ce sujet est que, puisque c'est dans un thread séparé, il est également, en parallèle, donc, tout ce que consomme votre flux d'entrée sera de streaming votre ancienne flux de sortie trop. C'est avantageux parce que la mémoire tampon peut rester plus petit et vous aurez moins de temps de latence et moins d'utilisation de la mémoire.

123voto

Java Drinker Points 1598

Un OutputStream est l'un où de l'écriture de données. Si certains module expose une OutputStream, on s'attend à ce qu'il y a quelque chose à l'autre extrémité qui est de la lecture.

Quelque chose qui expose une InputStream sur l'autre main est ce qui indique que vous aurez besoin d'écouter ce flux, et il y aura des données que vous pouvez lire.

Il est ainsi possible de connecter un InputStream d'un OutputStream

InputStream----read---> intermediateBytes[n] ----write----> OutputStream

Comme quelqu'un dessus décrite, c'est ce que l' copy() méthode de IOUtils vous permet de le faire. Il n'est pas logique d'aller dans l'autre sens... j'espère que cela a un sens

Mise à JOUR:

Bien entendu, plus j'y pense, plus je peux voir comment cela qui serait en fait une exigence. Je sais que certains commentaires mentionnés Piped input/ouput cours d'eau, mais il y a une autre possibilité.

Si le flux de sortie qui est exposée est une ByteArrayOutputStream, alors vous pouvez toujours obtenir la totalité du contenu par l'appel de la toByteArray() méthode. Ensuite, vous pouvez créer un flux d'entrée wrapper en utilisant l' ByteArrayInputStream sous-classe. Ces deux pseudo-flux, ils fondamentalement juste envelopper d'un tableau d'octets. En utilisant le flux de cette façon, par conséquent, il est techniquement possible, mais pour moi, c'est toujours très étrange...

46voto

boryto Points 1

Comme entrée et sortie sont simplement commencer à flux et point final, la solution consiste à stocker temporaire des données en tableau d’octets. Ce qui doit créer des intermédiaires ByteArrayOutputStream, à partir duquel vous créez byte [], qui est utilisé comme entrée pour ByteArrayInputStream nouvelle.

Elle pourra être qu'utile.

20voto

koppor Points 2066

Le easystream bibliothèque open source a un soutien direct pour convertir un OutputStream à un InputStream: https://code.google.com/p/io-tools/wiki/Tutorial_EasyStream

Ils ont également la liste des autres options: https://code.google.com/p/io-tools/wiki/OutputStream_to_InputStream.

19voto

mckamey Points 7215

Vous aurez besoin d'une classe intermédiaire qui permettra de tampon entre les deux. Chaque fois qu' InputStream.read(byte[]...) est appelé, la mise en mémoire tampon de la classe va remplir le passé dans le tableau d'octets avec la partie suivante transmis à partir de OutputStream.write(byte[]...). Étant donné que les tailles des blocs peut-être pas la même, la classe d'adaptateur aurez besoin de stocker une certaine quantité jusqu'à ce qu'il a de quoi remplir la mémoire tampon de lecture et/ou être capable de stocker jusqu'tout débordement de la mémoire tampon.

Cet article a une belle répartition des différentes approches de ce problème:

http://ostermiller.org/convert_java_outputstream_inputstream.html

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