เขียนสตริงลงในเอาต์พุตสตรีม


139

ฉันมีตัวรับเอาต์พุตหลายตัวที่กำลังใช้งาน OutputStream มันสามารถเป็นได้ทั้ง PrintStream การเขียนไปยัง stdout หรือไปที่ไฟล์หรือสามารถเขียนไปยังหน่วยความจำหรือปลายทางผลลัพธ์อื่น ๆ ; ดังนั้นฉันระบุ OutputStream เป็นอาร์กิวเมนต์ (an) ในวิธีการ

ตอนนี้ฉันได้รับสาย วิธีที่ดีที่สุดในการเขียนถึงสตรีมที่นี่คืออะไร

ฉันควรใช้ Writer.write (message.getBytes ()) หรือไม่ ฉันสามารถให้ไบต์ได้ แต่หากกระแสปลายทางเป็นกระแสข้อมูลตัวอักษรมันจะแปลงโดยอัตโนมัติหรือไม่

ฉันจำเป็นต้องใช้สตรีมบริดจ์บางส่วนที่นี่แทนไหม


2
ฉันไม่แน่ใจ แต่ดูเหมือนว่าคุณกำลังพยายามที่จะสร้างสรรค์สิ่งใหม่ ๆ ที่นี่คุณเคยลองใช้ Java Base API และ Commons IO API แล้วหรือยัง
posdef

คำตอบ:


149

สตรีม ( InputStreamและOutputStream) ถ่ายโอนข้อมูลไบนารี หากคุณต้องการที่จะเขียนสตริงกระแสก่อนอื่นคุณต้องแปลงเป็นไบต์หรือในคำอื่น ๆ ที่เข้ารหัสมัน คุณสามารถทำได้ด้วยตนเอง (ตามที่คุณแนะนำ) โดยใช้String.getBytes(Charset)วิธีการ แต่คุณควรหลีกเลี่ยงString.getBytes()วิธีนี้เนื่องจากใช้การเข้ารหัสเริ่มต้นของ JVM ซึ่งไม่สามารถคาดการณ์ได้อย่างน่าเชื่อถือในแบบพกพา

อย่างไรก็ตามวิธีปกติในการเขียนข้อมูลตัวละครลงในสตรีมนั้นคือการใส่คำสั่งลงใน a Writer(บ่อยครั้งPrintWriter) ที่จะทำการแปลงให้คุณเมื่อคุณเรียกใช้เมธอดwrite(String)(หรือprint(String)) เสื้อคลุมที่สอดคล้องกันสำหรับ InputStreams เป็นผู้อ่าน

PrintStreamเป็นการOutputStreamใช้งานพิเศษในแง่ที่มันยังมีวิธีการเข้ารหัสสตริงโดยอัตโนมัติ (มันใช้นักเขียนภายใน) แต่มันยังคงเป็นกระแส คุณสามารถปิดสตรีมของคุณกับนักเขียนได้อย่างปลอดภัยไม่ว่าจะเป็นการPrintStreamสตรีมแบบอื่น ๆ ไม่มีอันตรายจากการเข้ารหัสสองครั้ง

ตัวอย่างของ PrintWriter พร้อม OutputStream:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}

3
ดังนั้นการใช้เป็นเพียงเช่นการใช้PrintWriter String.getBytes()มันใช้การเข้ารหัสแบบสุ่มที่เกิดขึ้นเป็นค่าเริ่มต้นของ JVM ดังนั้นจะใช้งานได้ถ้าคุณโชคดี
Christoffer Hammarström

106

OutputStream เขียนไบต์สตริงให้ตัวอักษร คุณต้องกำหนดชุดอักขระเพื่อเข้ารหัสสตริงเป็นไบต์ []:

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

เปลี่ยนUTF-8เป็นชุดอักขระที่คุณเลือก


3
ผนวกกับบรรทัดต่อไปนี้ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel

32

คุณสามารถสร้างการตัดแบบ PrintStream รอบ OutputStream ของคุณแล้วเรียกมันว่าพิมพ์ (สตริง):

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();

2
PrintStream ชุดอักขระใดที่ใช้ในการแปลงเป็นไบต์
Dean Hiller


12

ห่อ OutputStream ของคุณด้วยPrintWriterและใช้วิธีการพิมพ์ในคลาสนั้น พวกเขาใช้สายอักขระและทำงานให้คุณ


9

คุณสามารถใช้Apache Commons IO :

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}

IOUtils.write(String data, OutputStream output, Charset encoding)ถูกนำมาใช้เป็นoutput.write(data.getBytes(Charsets.toCharset(encoding)))ดังนั้นจึงอาจเป็นถ้าสตริงที่เข้ารหัสไม่สามารถใส่ในอาร์เรย์ไบต์
Šarūnas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.