Création d’un stream d’entrée Java à partir d’un énumérateur ]

J’ai beaucoup lu sur Iteratees & Enumerators afin d’implémenter un nouveau module dans mon application.

Je suis maintenant sur le point d’intégrer une bibliothèque Java tierce et je ne peux plus travailler avec cette méthode:

public Email addAttachment(Ssortingng name, InputStream file) throws IOException { this.attachments.put(name, file); return this; } 

Ce que j’ai dans mon API est le corps renvoyé d’un appel HTTP WS qui est un Enumerator[Array[Byte]] .

Je me demande maintenant comment écrire un Iteratee qui traiterait les fragments de Array[Bytes] et créerait un InputStream à utiliser dans cette méthode.

(Barre latérale): Il existe d’autres versions de la méthode addAttachment qui prennent java.io.File Toutefois, je souhaite éviter d’écrire sur le disque lors de cette opération et préfère traiter les stream.

J’ai essayé de commencer en écrivant quelque chose comme ceci:

 Iteratee.foreach[Array[Byte]] { bytes => ??? } 

Cependant, je ne suis pas sûr de savoir comment interagir avec le java InputStream ici. J’ai trouvé quelque chose appelé ByteArrayInputStream mais qui prend tout le Array[Byte] dans son constructeur, mais je ne suis pas sûr que cela fonctionnerait dans ce scénario puisque je travaille avec des morceaux?

J’ai probablement besoin de l’aide de Java ici!

Merci d’avance pour toute aide.

Si je vous suis, je pense que vous souhaitez travailler avec PipedInputStream et PipedOutputStream:

https://docs.oracle.com/javase/8/docs/api/java/io/PipedInputStream.html

Vous les utilisez toujours par paires. Vous pouvez construire la paire comme suit:

 PipedInputStream in = new PipedInputStream(); //can also specify a buffer size PipedOutputStream out = new PipedOutputSream(in); 

Passez le stream d’entrée à l’API et, dans votre propre code, parcourez vos mandrins et écrivez vos octets.

Le seul inconvénient est que vous devez lire / écrire dans des threads séparés. Dans votre cas, il est probablement bon de faire votre itération / écriture dans un thread séparé. Je suis sûr que vous pouvez le gérer mieux que moi à Scala. En Java, ce serait quelque chose comme:

 PipedInputStream in = new PipedInputStream(); //can also specify a buffer size PipedOutputStream out = new PipedOutputSream(out); new Thread(() -> { // do your looping in here, write to 'out' out.close(); }).run(); email.addAttachment(in); email.send(); in.close(); 

(Laissant de côté la gestion des exceptions et des ressources pour plus de clarté)