Java: PrintStream'den String'e?


115

Belirli türde bir nesneyi ve PrintStreamyazdırılacak bir nesneyi alan ve bu nesnenin bir temsilini veren bir işlevim var. Bu işlevin çıktısını bir String'de nasıl yakalayabilirim? Özellikle, bir toStringyöntemde olduğu gibi kullanmak istiyorum .

Yanıtlar:


193

ByteArrayOutputStreamBir arabellek olarak kullanın :

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
Tüm kaynakları boşaltmak için PrintStream'i kapatmayı unutmayın.
tobr

9
PrintStream ps = new PrintStream(baos,true,"utf-8");Karakter kümesi kaosundan kaçınmak için kullanmanızı öneririm
Dr. Max Völkel

5
Kullanım new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);beri mevcut 1.7 , bu atmaz
earcam

2
@tobr kesinlikle iyi bir kuraldır, ancak ByteArrayOutputStream.close()" hiçbir etkisi yoktur ", çünkü çöp toplayıcı tarafından ele alınacak destek dizisinin yanı sıra serbest bırakılacak kaynak yoktur.
dimo414

ByteArrayOutputStreamvardır toString(String charsetName), ancak yalnızca String bağımsız değişkenini kabul eder. Ayrıca ByteArrayOutputStream'in senkronize edildiğini ve muhtemelen arzu edilmediğini unutmayın
panik yapmayın

31

Yapıcıya geçirilen bir ByteArrayOutputStream ile bir PrintStream oluşturabilirsiniz, bunu daha sonra PrintStream'e yazılan metni almak için kullanabilirsiniz.

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

5

Önceki cevapların bir birleşimi olan bu cevap Java 1.7 ve sonrası ile çalışır. Ayrıca, Akışları kapatmak için kod ekledim.

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

MyStrLine String değişkenini kullanarak bir girdi dizesi akışı oluşturan inSS adlı bir Tarayıcı değişkenini tanımlayın ve başlatın.

Ans: Tarayıcı inSS = yeni Tarayıcı (myStrLine);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.