Si vous avez un objet java.io.InputStream
, comment devez-vous traiter cet objet et produire un String
?
Supposons que j'ai un InputStream
qui contient des données textuelles, et que je veuille le convertir en String
, pour pouvoir par exemple l'écrire dans un fichier journal.
Quel est le moyen le plus simple de prendre le InputStream
et de le convertir en String
?
public String convertStreamToString(InputStream is) {
// ???
}
Une bonne façon de faire cela est d'utiliser [Apache commons][1] [IOUtils][2]
pour copier le InputStream
dans 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 pourriez utiliser ByteArrayOutputStream
si vous ne voulez pas mélanger vos flux et vos écrivains.
[1] : http://commons.apache.org/ [2] : https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html
Apache Commons permet :
String myString = IOUtils.toString(myInputStream, "UTF-8");
Bien sûr, vous pouvez choisir d'autres codages de caractères que l'UTF-8.
Voir aussi : ([documentation][1])
En tenant compte du fichier, on devrait d'abord obtenir une instance de java.io.Reader
. Celui-ci peut alors être lu et ajouté à un 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 en blocs, et en tant que tel, 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 à l'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();
}