web-dev-qa-db-fra.com

Convertir un flux en chaîne Java/Groovy

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
22
phil swenson

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.

45
phil swenson

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"). 

10
AechoLiu

Essayez IOUtils de Apache Commons:

String s = IOUtils.toString(inputStream, "UTF-8");
7
Tomasz Nurkiewicz

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();
}
4
jjnguy

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.

4
Afiefh

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.

2
Anon

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.

1
Noah Ternullo

Vous pouvez essayer quelque chose semblable à ceci

new FileInputStream( new File("c:/tmp/file.txt") ).eachLine { println it }
0
rfranr