Java: PrintStream เป็น String?


115

ฉันมีฟังก์ชั่นที่รับวัตถุประเภทหนึ่งและ a PrintStreamที่จะพิมพ์และแสดงผลการเป็นตัวแทนของวัตถุนั้น ฉันจะจับเอาท์พุทของฟังก์ชันนี้ในสตริงได้อย่างไร? โดยเฉพาะฉันต้องการใช้เป็นtoStringวิธีการ

คำตอบ:


193

ใช้ a ByteArrayOutputStreamเป็นบัฟเฟอร์:

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
อย่าลืมปิด PrintStream เพื่อปลดปล่อยทรัพยากรทั้งหมด
tobr

9
ฉันขอแนะนำให้ใช้ PrintStream ps = new PrintStream(baos,true,"utf-8");เพื่อหลีกเลี่ยงความสับสนวุ่นวาย
ดร. Max Völkel

5
ใช้new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);มีตั้งแต่1.7ก็ไม่ได้โยน
earcam

2
@tobr เป็นกฎที่ดีอย่างแน่นอน แต่ByteArrayOutputStream.close()" ไม่มีผล " เนื่องจากไม่มีทรัพยากรใด ๆ ที่จะว่างนอกจากอาร์เรย์สำรองซึ่งจะจัดการกับคนเก็บขยะ
dimo414

ByteArrayOutputStreamมีtoString(String charsetName)แต่ยอมรับอาร์กิวเมนต์สตริงเท่านั้น นอกจากนี้ทราบว่า ByteArrayOutputStream จะตรงกันซึ่งอาจไม่พึงประสงค์
ไม่ต้องตกใจ

31

คุณสามารถสร้าง PrintStream ด้วย ByteArrayOutputStream ที่ส่งผ่านไปยังตัวสร้างซึ่งคุณสามารถใช้ในภายหลังเพื่อจับข้อความที่เขียนไปยัง PrintStream

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

5

การรวมคำตอบก่อนหน้านี้คำตอบนี้ใช้ได้กับ Java 1.7 และหลังจากนั้น นอกจากนี้ฉันยังเพิ่มรหัสเพื่อปิดสตรีม

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

กำหนดและเริ่มต้นตัวแปร Scanner ชื่อ inSS ที่สร้างสตรีมสตริงอินพุตโดยใช้ตัวแปร String myStrLine

ตอบ: Scanner inSS = สแกนเนอร์ใหม่ (myStrLine);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.