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.