4695 votes

Comment lire / convertir un InputStream en String en Java ?

Si vous avez un java.io.InputStream comment devez-vous traiter cet objet et produire une String ?


Supposons que j'ai un InputStream qui contient des données de type texte, et je veux le convertir en un fichier String Ainsi, je peux, par exemple, l'écrire dans un fichier journal.

Quel est le moyen le plus simple de prendre le InputStream et le convertir en un String ?

public String convertStreamToString(InputStream is) {
    // ???
}

0 votes

2 votes

N'oubliez pas que vous devez prendre en compte l'encodage du flux d'entrée. La valeur par défaut du système n'est pas nécessairement celle que vous souhaitez.

21 votes

La plupart de ces réponses ont été écrites avant Java 9, mais maintenant vous pouvez obtenir un tableau d'octets à partir de l'InputStream en utilisant .readAllBytes. Donc, simplement "new String(inputStream.readAllBytes())" fonctionne en utilisant le constructeur byte[] de String.

2755voto

Harry Lime Points 8229

Une bonne façon de le faire est d'utiliser Apache commons [IOUtils](https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html) pour copier le InputStream en un StringWriter ... quelque chose comme

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

ou même

// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding); 

Alternativement, vous pouvez utiliser ByteArrayOutputStream si vous ne voulez pas mélanger vos flux et vos rédacteurs.

0 votes

Est-ce que le toString a été déprécié ? Je vois IOUtils.convertStreamToString()

0 votes

J'ai ajouté une modification pour inclure un lien consultable vers le code source lui-même en tant que référence. Je pense que cela augmente la réponse pour ceux qui veulent voir comment la commande fonctionne.

2361voto

Pavel Repin Points 13751

Voici une méthode utilisant uniquement la bibliothèque Java standard (notez que le flux n'est pas fermé, votre expérience peut varier).

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

J'ai appris cette astuce de "Trucs stupides du scanner" article. La raison pour laquelle cela fonctionne est que Scanner itère sur les tokens dans le flux, et dans ce cas nous séparons les tokens en utilisant "début de la frontière d'entrée" ( \A ), ce qui nous donne un seul jeton pour l'ensemble du contenu du flux.

Remarque : si vous devez être spécifique quant à l'encodage du flux d'entrée, vous pouvez fournir le second argument à la fonction Scanner qui indique le jeu de caractères à utiliser (par exemple, "UTF-8").

Le conseil du chapeau va aussi à Jacob qui m'a renvoyé à cet article.

0 votes

Ne devrions-nous pas fermer l'analyseur avant de retourner la valeur ?

0 votes

@OlegMarkelov probablement.

890voto

Chinnery Points 5830

Apache Commons permet :

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

Bien entendu, vous pouvez choisir d'autres codages de caractères que l'UTF-8.

Voir aussi : ( documentation )

1 votes

Essayer de récupérer l'InputStream, ne fonctionne pas stackoverflow.com/q/66349701/3425489

321voto

Paul de Vrieze Points 3715

En tenant compte du dossier, il faut d'abord obtenir un java.io.Reader instance. Celle-ci peut ensuite être lue et ajoutée à une StringBuilder (nous n'avons pas besoin de StringBuffer si nous n'y accédons pas dans plusieurs threads, et StringBuilder est plus rapide). L'astuce ici est que nous travaillons par blocs, et en tant que tels, nous n'avons pas besoin d'autres flux de mise en mémoire tampon. La taille des blocs est paramétrée pour optimiser les performances d'exécution.

public static String slurp(final InputStream is, final int bufferSize) {
    final char[] buffer = new char[bufferSize];
    final StringBuilder out = new StringBuilder();
    try (Reader in = new InputStreamReader(is, "UTF-8")) {
        for (;;) {
            int rsz = in.read(buffer, 0, buffer.length);
            if (rsz < 0)
                break;
            out.append(buffer, 0, rsz);
        }
    }
    catch (UnsupportedEncodingException ex) {
        /* ... */
    }
    catch (IOException ex) {
        /* ... */
    }
    return out.toString();
}

272voto

sampathpremarathna Points 2080

Utilisez :

InputStream in = /* Your InputStream */;
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String read;

while ((read=br.readLine()) != null) {
    //System.out.println(read);
    sb.append(read);
}

br.close();
return sb.toString();

2 votes

readLine() supprime le caractère de saut de ligne, de sorte que la chaîne résultante ne contiendra aucun saut de ligne, à moins que vous n'ajoutiez un séparateur de ligne entre chaque ligne ajoutée au constructeur.

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