Obtenir un flux sortant dans une chaîne

Quelle est la meilleure façon de pipe la sortie d'un java.io.OutputStream vers une chaîne de caractères en Java?

Dire que j'ai de la méthode:

  writeToStream(Object o, OutputStream out)

qui écrit certaines données de l'objet vers le flux donné. Cependant, je veux obtenir ce résultat dans une Chaîne aussi facilement que possible.

j'envisage d'écrire une classe comme celle-ci (non testée):

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 ne veux exécuter un test!

504
demandé sur Jonik 2008-10-20 00:03:23

4 réponses

j'utiliserais un ByteArrayOutputStream . Et à la fin vous pouvez appeler:

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

ou mieux

baos.toString( codepage );

pour le constructeur de chaînes, le codepage peut être une chaîne ou une instance de java.nio.jeu de caractères.Charset . Une valeur possible est java.nio.jeu de caractères.StandardCharsets.UTF_8 .

la méthode toString accepte seulement une chaîne de caractères comme paramètre codepage (stand Java 8).

538
répondu Horcrux7 2014-12-14 12:20:37

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

43
répondu Joe Liversedge 2016-11-15 14:43:50

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

ensuite, pour imprimer la chaîne ou l'obtenir, référez-vous simplement au flux de "sortie" lui-même. À titre d'exemple, pour imprimer la chaîne sur la console = > > System.out.println(output);

FYI: mon appel de méthode marshaller.marshal(Object,Outputstream) est pour travailler avec XML. Il n'est pas pertinent à ce sujet.

c'est très gaspilleur pour une utilisation productive, il y a beaucoup trop conversion et il est un peu lâche. Ceci a été codé juste pour vous prouver qu'il est totalement possible de créer une chaîne personnalisée et de produire une chaîne. Mais juste aller Horcrux7 chemin et tout va bien avec seulement deux appels de méthode.

et le monde vit un autre jour....

23
répondu KIN 2018-07-25 14:48:11

voilà 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 .

12
répondu Adrian Mouat 2010-09-22 16:28:50