Java: PrintStream to String?


115

Mam funkcję, która przyjmuje obiekt określonego typu i PrintStreamdo którego ma zostać wydrukowany i wyprowadza reprezentację tego obiektu. Jak mogę przechwycić dane wyjściowe tej funkcji w ciągu? W szczególności chcę go używać jako toStringmetody.

Odpowiedzi:


193

Użyj ByteArrayOutputStreamjako bufora:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final String utf8 = StandardCharsets.UTF_8.name();
    try (PrintStream ps = new PrintStream(baos, true, utf8)) {
        yourFunction(object, ps);
    }
    String data = baos.toString(utf8);

10
Nie zapomnij zamknąć PrintStream, aby zwolnić wszystkie zasoby.
— tobr

9
Sugerowałbym użycie, PrintStream ps = new PrintStream(baos,true,"utf-8");aby uniknąć chaosu kodowania znaków
— Dr. Max Völkel

5
Użyj new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);dostępne od 1.7 , nie rzuca się
— kamera douszna

2
@tobr z pewnością jest dobrą zasadą praktyczną, ale ByteArrayOutputStream.close()„ nie ma wpływu ”, ponieważ nie ma żadnych zasobów do zwolnienia poza tablicą zapasową, którą zajmie się garbage collector.
— dimo414

ByteArrayOutputStreamma toString(String charsetName), ale akceptuje tylko argument String. Zwróć również uwagę, że ByteArrayOutputStream jest zsynchronizowany , co prawdopodobnie nie jest pożądane
— nie panikuj

31

Możesz skonstruować PrintStream z ByteArrayOutputStream przekazanym do konstruktora, którego możesz później użyć do pobrania tekstu zapisanego do PrintStream.

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");

5

Ujednolicenie poprzednich odpowiedzi, ta odpowiedź działa z Javą 1.7 i późniejszymi. Dodałem również kod zamykający strumienie.

final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();


-3

Zdefiniuj i zainicjuj zmienną Scanner o nazwie inSS, która tworzy wejściowy strumień ciągu przy użyciu zmiennej String myStrLine.

Odp: Skaner inSS = nowy skaner (myStrLine);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.