Java : comment convertir un objet InputStream en une chaîne ?

Il est courant que l'on cherche à transformer un flux d'entrée en chaîne de caractères. Il existe différentes solutions pour pouvoir créer une fonction qui effectue la conversion.

En Java, tous les flux d'entrée sont gérés par la classe InputStream. Dès que l'on souhaite lire un fichier, que ce soit des caractères ou des octets, par le biais de la mémoire tampon ou directement, on utilisera toujours cette classe ou une classe qui en hérite.

Il est courant que l'on cherche à transformer un flux d'entrée en chaîne de caractères pour effectuer d'autres traitements. Il existe différentes solutions pour pouvoir créer une fonction qui effectue la conversion. La librairie Apache commons contient la classe IOUtils qui fournit des outils pour manipuler les flux. La méthode copy() copie les octets d'un inputstream dans les caractères d'un writer, avec l'encodage précisé en paramètre. Il n'y a plus qu'à appeler la méthode toString() de la classe Writer pour obtenir une chaîne de caractères.

Exemple :

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encodage);
String chaine = writer.toString();

Il est cependant possible de raccourcir encore ce code. La classe IOUtils possède la méthode toString, qui convertit directement un flux d'entrée en caractères avec l'encodage souhaité.

Exemple :

String chaine = IOUtils.toString(myInputStream, UTF-8);

Si vous ne voulez pas utiliser de librairies supplémentaires, la classe scanner vous sera utile. Cette classe peut lire n'importe quel flux d'entrée jusqu'à un délimiteur que l'on précise avec la méthode useDellemiter(). En lui précisant le délimiteur A, on lui signifie de récupérer le flux jusqu'au prochain début. Cette consigne, illogique normalement, permet de scanner tout le flux. Le scanner implémentant la classe Iterator, il se lit de la même manière qu'un itérateur classique.

Exemple :

public static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter(A);
return s.hasNext() ? s.next() : ;
}

Java