Question Obtenir un OutputStream dans une chaîne


Quelle est la meilleure façon 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 veux que cette sortie soit 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!


495
2017-10-19 20:03


origine


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 String, le codepage 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 une chaîne comme codepage paramètre (stand Java 8).


531
2017-10-19 20:15



J'aime la librairie Apache Commons IO. Jetez un oeil à sa version de ByteArrayOutputStream, qui a un toString(String enc) méthode 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
2017-10-19 20:23



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 l'obtenir, il suffit de faire référence au flux "sortie" lui-même Par exemple, pour imprimer la chaîne en console = >> System.out.println(output);

FYI: mon appel de méthode marshaller.marshal(Object,Outputstream) est de travailler avec XML. Cela n'a rien à voir avec ce sujet.

C'est un gaspillage énorme pour l'utilisation en production, il y a beaucoup trop de conversion et c'est un peu lâche. Cela a juste été codé pour vous prouver qu'il est totalement possible de créer un OuputStream personnalisé et de sortir une chaîne. Mais allez juste Horcrux7 et tout va bien avec seulement deux appels de méthode.

Et le monde vit un autre jour ...


23
2018-06-20 20:13



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.


12
2017-11-03 21:04



Pourquoi n'utilisez-vous pas un ByteArrayOutputStream? C'est ce que vous êtes censé utiliser à cette fin.


-12
2017-08-02 09:05