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.

Nick Heiner
źródło

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);
ChssPly76
źródło
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");
Asaf
źródło
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();
Kaelan Dawnstar
źródło
-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);

user7805633
źródło