Question

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

Disons 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 un meilleur moyen? Je veux seulement faire un test!

Était-ce utile?

La solution

Je voudrais utiliser un ByteArrayOutputStream . Et en fin de compte, vous pouvez appeler:

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

ou mieux

baos.toString( codepage );

Pour le constructeur String, la page de code peut être une chaîne ou une instance de java.nio.charset.Charset . Une valeur possible est java.nio.charset .StandardCharsets.UTF_8 .

La méthode toString accepte uniquement le paramètre String as page de code (stand Java 8).

Autres conseils

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

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

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

puis pour imprimer la chaîne ou l'obtenir, il suffit de référencer la "sortie" se diffuser Par exemple, pour imprimer la chaîne sur console = > > System.out.println (sortie);

FYI: mon appel de méthode marshaller.marshal (Object, Outputstream) permet de travailler avec XML. Cela n'a aucun rapport avec ce sujet.

Cela représente un grand gaspillage pour une utilisation en production, il y a beaucoup trop de conversions et c'est un peu lâche. Cela vient d'être 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 ....

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top