J'ai volé cet extrait du Web. Mais il semble être limité à 4096 octets et est tout à fait moche OMI. Quelqu'un sait d'une meilleure approche? En fait, j'utilise Groovy ...
String streamToString(InputStream input) {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = input.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
return out.toString();
}
MODIFIER:
J'ai trouvé une meilleure solution dans Groovy:
InputStream exportTemplateStream = getClass().getClassLoader().getResourceAsStream("export.template")
assert exportTemplateStream: "[export.template stream] resource not found"
String exportTemplate = exportTemplateStream.text
Quelques bonnes et rapides réponses. Cependant, je pense que le meilleur est Groovy a ajouté une méthode "getText" à InputStream. Donc, tout ce que je devais faire était stream.text
. Et bon appel sur le commentaire 4096.
Pour Groovy
filePath = ... //< a FilePath object
stream = filePath.read() //< InputStream object
content = stream.getText("UTF-16") //< Specify the encoding, and get the String object
La référence de la classe InputStream
La getText()
sans codage utilisera le codage actuel du système, ex ("UTF-8").
Essayez IOUtils
de Apache Commons:
String s = IOUtils.toString(inputStream, "UTF-8");
Vous pouvez le faire assez facilement en utilisant Scanner
class:
String streamToSring(InputStream input) {
Scanner s = new Scanner(input);
StringBuilder builder = new StringBuilder();
while (s.hasNextLine()) {
builder.append(s.nextLine() +"\n");
}
return builder.toString();
}
Il lit les entrées en morceaux de 4096 octets (4 Ko), mais la taille de la chaîne réelle n'est pas limitée car il continue à lire et à être ajouté au SringBuffer.
Cet extrait contient un bogue: si l'entrée utilise un encodage de caractères multi-octets, il y a de bonnes chances qu'un seul caractère s'étende sur deux lectures (et ne soit pas convertible). Et il a aussi le semi-bug qu'il repose sur le codage par défaut de la plate-forme.
Utilisez plutôt Jakarta Commons IO . En particulier, la version de IOUtils.toString()
qui prend une InputStream
et lui applique un codage.
Pour les futurs réviseurs qui rencontrent des problèmes similaires, notez que les méthodes IOUtils d’Apache et InputStream.getText () de Groovy exigent que le flux soit complet ou qu’il soit fermé avant de nous renvoyer. Si vous travaillez avec un flux persistant, vous ne pourrez plus vous servir de l'exemple "moche" que Phil a posté à l'origine, ni travailler avec des entrées-sorties non bloquantes.
Vous pouvez essayer quelque chose semblable à ceci
new FileInputStream( new File("c:/tmp/file.txt") ).eachLine { println it }