Java: PrintStream ke String?

115

Saya memiliki fungsi yang mengambil objek dari tipe tertentu, dan PrintStreamuntuk mencetak, dan mengeluarkan representasi dari objek itu. Bagaimana cara menangkap output fungsi ini dalam String? Secara khusus, saya ingin menggunakannya sebagai toStringmetode.

Nick Heiner
sumber

Jawaban:

193

Gunakan a ByteArrayOutputStreamsebagai buffer:

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
sumber
10
Jangan lupa untuk menutup PrintStream untuk membebaskan semua sumber daya.
tobr
9
Saya akan menyarankan untuk menggunakan PrintStream ps = new PrintStream(baos,true,"utf-8");untuk menghindari kekacauan charset
Dr. Max Völkel
5
Penggunaan new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);tersedia sejak 1.7 , itu tidak membuang
earcam
2
@tobr jelas merupakan aturan praktis yang baik, tetapi ByteArrayOutputStream.close()" tidak berpengaruh ", karena tidak ada sumber daya yang dapat dikosongkan selain larik dukungan yang akan ditangani oleh pengumpul sampah.
dimo414
ByteArrayOutputStreammemiliki toString(String charsetName), tetapi hanya menerima argumen String. Perhatikan juga bahwa ByteArrayOutputStream disinkronkan , yang mungkin tidak diinginkan
jangan panik
31

Anda dapat membuat PrintStream dengan ByteArrayOutputStream yang diteruskan ke konstruktor yang nantinya dapat Anda gunakan untuk mengambil teks yang ditulis ke PrintStream.

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

Sebuah penyatuan jawaban sebelumnya, jawaban ini bekerja dengan Java 1.7 dan setelahnya. Juga, saya menambahkan kode untuk menutup Streams.

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
sumber
-3

Tentukan dan inisialisasi variabel Scanner bernama inSS yang membuat aliran string input menggunakan variabel String myStrLine.

Jawab: Scanner inSS = New Scanner (myStrLine);

pengguna7805633
sumber