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.

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);

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");

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();


-3

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

Jawab: Scanner inSS = New Scanner (myStrLine);

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.