web-dev-qa-db-fra.com

Obtenir un OutputStream dans une chaîne

Quel est le meilleur moyen de canaliser la sortie d'un Java.io.OutputStream vers une chaîne en Java?

Dis que j'ai la méthode:

  writeToStream(Object o, OutputStream out)

Qui écrit certaines données de l'objet dans le flux donné. Cependant, je souhaite obtenir cette sortie dans une chaîne aussi facilement que possible.

J'envisage d'écrire un cours comme celui-ci (non testé):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

Mais y a-t-il une meilleure façon? Je veux seulement faire un test!

550
Adrian Mouat

Je voudrais utiliser un ByteArrayOutputStream. Et à la fin, vous pouvez appeler:

new String( baos.toByteArray(), codepage );

ou mieux:

baos.toString( codepage );

Pour le constructeur String, le codepage peut être un String ou une instance de Java.nio.charset.Charset . Une valeur possible est Java.nio.charset.StandardCharsets.UTF_8 .

La méthode toString() accepte uniquement un paramètre String en tant que paramètre codepage (stand Java 8).

582
Horcrux7

J'aime la bibliothèque Apache Commons IO. Jetez un coup d'oeil à sa version de ByteArrayOutputStream , qui a une méthode toString(String enc) ainsi que toByteArray(). L'utilisation de composants existants et de confiance, tels que le projet Commons, permet à votre code d'être plus petit et plus facile à étendre et à réutiliser.

44
Joe Liversedge

Cela a bien fonctionné

    OutputStream output = new OutputStream()
    {
        private StringBuilder string = new StringBuilder();
        @Override
        public void write(int b) throws IOException {
            this.string.append((char) b );
        }

        //Netbeans IDE automatically overrides this toString()
        public String toString(){
            return this.string.toString();
        }
    };

appel de méthode = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

puis pour imprimer la chaîne ou pour l'obtenir, il suffit de référencer le flux "de sortie" lui-même. Exemple: imprimer la chaîne sur console = >> System.out.println(output);

FYI: mon appel de méthode marshaller.marshal(Object,Outputstream) est destiné à travailler avec XML. Cela n'a pas d'importance pour ce sujet.

Ceci est très coûteux pour une utilisation en production, il y a beaucoup trop de conversion et c'est un peu lâche. Ceci a juste été codé pour vous prouver qu'il est tout à fait possible de créer un OuputStream personnalisé et de générer une chaîne. Mais suivez simplement Horcrux7 et tout va bien avec seulement deux appels de méthode.

Et le monde vit un autre jour ...

23
alcardenas

Voici ce que j'ai fini par faire:

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

Où os est un ByteArrayOutputStream.

14
Adrian Mouat