Get a OutputStream into a String

Jaki jest najlepszy sposób na przekierowanie wyjścia z java. io. OutputStream do ciągu znaków w Javie?

Powiedzmy, że mam metodę:

  writeToStream(Object o, OutputStream out)

Który zapisuje określone dane z obiektu do podanego strumienia. Jednak chcę, aby to wyjście w ciąg znaków tak łatwo, jak to możliwe.

Rozważam napisanie takiej klasy (nieprzetestowanej):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

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

  public String getString() {
    return mBuf.toString();
  }
}
Ale czy jest lepszy sposób? Chcę tylko zrobić test!
Author: Jonik, 2008-10-20

4 answers

Użyłbym ByteArrayOutputStream. A na finiszu można zadzwonić:

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

Lub lepiej

baos.toString( codepage );

Dla konstruktora Łańcuchowego codepage może być łańcuchem lub instancją Javy.nio.charset.Charset . Możliwa wartość to java.nio.charset.Standardowe zestawy.UTF_8 .

Metoda ToString akceptuje tylko Łańcuch znaków jako parametr codepage (stand Java 8).

 538
Author: Horcrux7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-14 12:20:37

Lubię bibliotekę Apache Commons IO. Spójrz na jego wersję ByteArrayOutputStream , która ma metodę toString(String enc) oraz toByteArray(). Korzystanie z istniejących i zaufanych komponentów, takich jak projekt Commons, pozwala na mniejsze i łatwiejsze rozszerzanie i zmienianie przeznaczenia kodu. Powodzenia.

 43
Author: Joe Liversedge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 14:43:50

To działało ładnie

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

Wywołanie metody =>> marshaller.marshal( (Object) toWrite , (OutputStream) output);

Następnie, aby wydrukować łańcuch lub uzyskać go, po prostu odwołaj się do samego strumienia" output" Jako przykład, aby wydrukować ciąg znaków na konsoli =>> System.out.println(output);

FYI: moje wywołanie metody {[3] } jest do pracy z XML. Nie ma to znaczenia w tym temacie.

Jest to bardzo marnotrawne dla użytku produkcyjnego, jest zbyt wiele konwersji i jest trochę luźne. To zostało zakodowane, aby udowodnić, że jest całkowicie możliwe, aby utworzyć Niestandardowy OuputStream i wypisuje ciąg znaków. Ale wystarczy przejść Horcrux7 sposób i wszystko jest dobre z zaledwie dwóch wywołań metody.

I świat żyje w innym dniu....
 23
Author: KIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 14:48:11

Oto co zrobiłem:

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

Gdzie os jest ByteArrayOutputStream.

 12
Author: Adrian Mouat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-22 16:28:50