1. OutputStreamชั้นเรียน
เราเพิ่งสำรวจอินพุตสตรีมเมื่อไม่นานมานี้ ถึงเวลาที่จะพูดคุยเกี่ยวกับกระแสข้อมูลออก
คลาส นี้OutputStreamเป็นคลาสพาเรนต์สำหรับทุกคลาสที่รองรับเอาต์พุตแบบไบต์ นี่คือคลาสนามธรรมที่ไม่ได้ทำอะไรด้วยตัวเอง แต่มีคลาสสืบทอดสำหรับทุกโอกาส
ฟังดูซับซ้อนมาก เพื่อให้เข้าใจง่ายขึ้น คลาสนี้ทำงานเป็นไบต์ ไม่ใช่อักขระหรือประเภทข้อมูลอื่นๆ และความจริงที่ว่ามันเป็นนามธรรมหมายความว่าเรามักจะไม่ใช้มัน แต่เป็นคลาสที่สืบทอดมา ตัวอย่างเช่นFileOutputStreamและอื่น ๆ
แต่กลับไปที่OutputStreamชั้นเรียน คลาสนี้มีเมธอดที่คลาสที่สืบทอดมาทั้งหมดต้องนำไปใช้ นี่คือรายการหลัก:
| วิธีการ | คำอธิบาย |
|---|---|
|
เขียนหนึ่งไบต์ (ไม่ใช่ an int) ไปยังสตรีม |
|
เขียนอาร์เรย์ของไบต์ไปยังสตรีม |
|
เขียนส่วนหนึ่งของอาร์เรย์ของไบต์ไปยังสตรีม |
|
เขียนข้อมูลทั้งหมดที่เก็บไว้ในบัฟเฟอร์ไปยังสตรีม |
|
ปิดสตรีม |
เมื่อคุณสร้างออบเจกต์ของคลาสที่สืบทอดมาInputStreamคุณมักจะระบุออบเจกต์ต้นทางที่อ อบเจกต์นั้น InputStreamใช้อ่านข้อมูล เมื่อคุณสร้างออบเจกต์ของคลาสที่สืบทอดมาOutputStreamคุณมักจะระบุออบเจ็กต์เป้าหมายหรือสตรีมที่จะเขียนข้อมูลลงไปด้วย
มาดูวิธีการทั้งหมดของOutputStreamชั้นเรียนโดยสังเขป:
write(int b)วิธี
วิธีนี้เขียนหนึ่งไบต์ (ไม่ใช่ an int) ไปยังเอาต์พุตสตรีม ค่าที่ผ่านจะถูกส่งไปยังไบต์ และสามไบต์แรกของ int จะถูกละทิ้ง
write(byte[] buffer)วิธี
เขียนอาร์เรย์ของไบต์ที่กำหนดไปยังสตรีมเอาต์พุต แค่นั้นแหละ.
write(byte[] buffer, int offset, int length)วิธี
เขียนส่วนหนึ่งของอาร์เรย์ของไบต์ที่ส่งผ่านไปยังเอาต์พุตสตรีม ตัวแปร offset บ่งชี้ดัชนีขององค์ประกอบแรกของอาร์เรย์ และlengthเป็นความยาวของชุดย่อยที่จะเขียน
flush()วิธี
เมธอด นี้flush()ใช้เพื่อบังคับข้อมูลใดๆ ที่อาจถูกบัฟเฟอร์ในสตรีมปัจจุบันให้เขียนไปยังสตรีมเป้าหมาย สิ่งนี้มีความเกี่ยวข้องเมื่อใช้บัฟเฟอร์และ/หรือสตรีมอ็อบเจ็กต์หลายรายการที่จัดเรียงในสายโซ่
close()วิธี
เขียนข้อมูลที่ยังไม่ได้เขียนไปยังวัตถุเป้าหมาย close()ไม่จำเป็นต้องเรียกเมธอดนี้ หากคุณใช้ try-with-resourcesบล็อก
ตัวอย่างการคัดลอกไฟล์
| รหัส | บันทึก |
|---|---|
|
InputStreamสำหรับอ่านจากไฟล์OutputStreamสำหรับเขียนไปยังไฟล์บัฟเฟอร์ที่เราจะอ่านข้อมูล ตราบเท่าที่มีข้อมูลในสตรีม อ่านข้อมูลลงในบัฟเฟอร์ เขียนข้อมูลจากบัฟเฟอร์ไปยังสตรีมที่สอง |
2. Writerชั้นเรียน
คลาส นั้นWriterเหมือนกับOutputStreamคลาสทุกประการ แต่มีความแตกต่างเพียงอย่างเดียวอีกครั้ง: มันใช้งานได้กับอักขระ ( char) แทนที่จะเป็นไบต์
นี่คือคลาสนามธรรม: คุณไม่สามารถสร้างวัตถุของWriterคลาสได้ เป้าหมายหลักคือการเป็นคลาสหลักทั่วไปสำหรับคลาสลูกหลานหลายร้อยคลาส และให้วิธีการทั่วไปในการทำงานกับสตรีมอักขระ
วิธีการของWriterคลาส (และคลาสที่สืบทอดมาทั้งหมด):
| วิธีการ | คำอธิบาย |
|---|---|
|
เขียนอักขระหนึ่งตัว (ไม่ใช่int) ไปยังสตรีม |
|
เขียนอาร์เรย์ของอักขระไปยังสตรีม |
|
เขียนส่วนหนึ่งของอาร์เรย์ของอักขระไปยังสตรีม |
|
เขียนสตริงไปยังสตรีม |
|
เขียนส่วนหนึ่งของสตริงไปยังสตรีม |
|
เขียนข้อมูลทั้งหมดที่เก็บไว้ในบัฟเฟอร์ไปยังสตรีม |
|
ปิดสตรีม |
เมธอดนั้นคล้ายกับเมธอดของOutputStreamคลาสมาก แต่ทำงานกับอักขระแทนไบต์
คำอธิบายของวิธีการ:
write(int b)วิธี
วิธีนี้เขียนอักขระตัวเดียว ( char— ไม่ใช่ an int) ไปยังเอาต์พุตสตรีม ค่าที่ส่งผ่านจะถูกส่งไปยัง a charและสองไบต์แรกจะถูกละทิ้ง
write(char[] buffer)วิธี
เขียนอาร์เรย์ของอักขระที่กำหนดไปยังสตรีมเอาต์พุต
write(char[] buffer, int offset, int length)วิธี
เขียนส่วนหนึ่งของอาร์เรย์ของอักขระที่ส่งผ่านไปยังเอาต์พุตสตรีม ตัวแปรoffsetระบุดัชนีขององค์ประกอบแรกของอาร์เรย์ และlengthเป็นความยาวของชุดย่อยที่จะเขียน
write(String str)วิธี
เขียนสตริงที่กำหนดไปยังสตรีมเอาต์พุต
write(String str, int offset, int length)วิธี
เขียนส่วนหนึ่งของสตริงที่กำหนดไปยังสตรีมเอาต์พุต: สตริงจะถูกแปลงเป็นอาร์เรย์ของอักขระ ตัวแปรoffsetระบุดัชนีขององค์ประกอบแรกของอาร์เรย์ และlengthเป็นความยาวของชุดย่อยที่จะเขียน
flush()วิธี
เมธอด นี้flush()ใช้เพื่อบังคับข้อมูลใดๆ ที่อาจถูกบัฟเฟอร์ในสตรีมปัจจุบันให้เขียนไปยังสตรีมเป้าหมาย สิ่งนี้มีความเกี่ยวข้องเมื่อใช้บัฟเฟอร์และ/หรือสตรีมอ็อบเจ็กต์หลายรายการที่จัดเรียงในสายโซ่
close()วิธี
เขียนข้อมูลที่ยังไม่ได้เขียนไปยังวัตถุเป้าหมาย close()ไม่จำเป็นต้องเรียกเมธอดนี้ หากคุณใช้ try-with-resourcesบล็อก
ตัวอย่างโปรแกรมที่คัดลอกไฟล์ข้อความ:
| รหัส | บันทึก |
|---|---|
|
Readerสำหรับอ่านจากไฟล์Writerสำหรับเขียนลงไฟล์บัฟเฟอร์ที่เราจะอ่านข้อมูล ตราบเท่าที่มีข้อมูลในสตรีม อ่านข้อมูลลงในบัฟเฟอร์ เขียนข้อมูลจากบัฟเฟอร์ไปยังสตรีมที่สอง |
StringWriterระดับ
มีคลาสที่น่าสนใจอีกคลาสหนึ่งที่สืบทอดมาWriter: เรียกว่าStringWriter. มันมีสตริงที่ไม่แน่นอน — StringBufferวัตถุ และทุกครั้งที่คุณ "เขียน" บางสิ่งลงในStringWriterวัตถุ ข้อความนั้นจะถูกเพิ่มลงในบัฟเฟอร์ภายใน
ตัวอย่าง:
| รหัส | บันทึก |
|---|---|
|
StringWriterสร้างสตรีมอักขระเป้าหมาย ( ) สตริงถูกเขียนไปยังบัฟเฟอร์ภายใน StringWriterสตริงถูกเขียนไปยังบัฟเฟอร์ภายใน StringWriterการแปลงเนื้อหาของวัตถุเป็นสตริง |
ในกรณีนี้StringWriterคลาสโดยพื้นฐานแล้วเป็น wrapper เหนือStringBufferคลาส แต่StringWriterคลาสนั้นเป็นลูกหลานของWriterคลาสสตรีม และสามารถใช้ในสายโซ่ของสตรีมออบเจกต์ได้ นี่เป็นคุณสมบัติที่มีประโยชน์ในทางปฏิบัติ
3. PrintStreamชั้นเรียน
คลาสสตรีมเอาต์พุตยังสามารถใส่ในห่วงโซ่ที่มีสตรีมตัวกลางที่เขียนข้อมูลไปยังสตรีมเป้าหมายที่ส่งผ่านไปยังสตรีมเหล่านั้น มุมมองทั่วไปของการโต้ตอบของสตรีมเหล่านี้มีลักษณะดังนี้:

สิ่งที่น่าสนใจและหลากหลายที่สุดในบรรดาสตรีมเอาท์พุตระดับกลางทั้งหมดPrintStreamคือ มีวิธีการนับสิบและตัวสร้างมากถึง 12 ตัว
คลาสPrintStreamสืบทอดFilterOutputStreamคลาสซึ่งสืบทอดOutputStreamมา นั่นหมายความว่าPrintStreamคลาสมีเมธอดทั้งหมดของคลาสพาเรนต์นอกเหนือจากเมธอดของตัวเอง นี่คือสิ่งที่น่าสนใจที่สุด:
| วิธีการ | คำอธิบาย |
|---|---|
|
แปลงออบเจกต์ที่ผ่านเป็นสตริงและส่งออกไปยังสตรีมเป้าหมาย |
|
แปลงออบเจกต์ที่ผ่านเป็นสตริงและส่งออกไปยังสตรีมเป้าหมาย เพิ่มตัวแบ่งบรรทัดในตอนท้าย |
|
ส่งออกอักขระตัวแบ่งบรรทัดไปยังสตรีมเป้าหมาย |
|
สร้างและส่งออกสตริงตามสตริงรูปแบบและอาร์กิวเมนต์ที่ส่งผ่าน คล้ายกับString.format()วิธีการ |
และสิบวิธีเหล่านี้คุณถามที่ไหน?
มันมีหลายรูปแบบprint()และprintln()วิธีการที่มีพารามิเตอร์ที่แตกต่างกัน สามารถสรุปได้ในตารางนี้
เราจะไม่ลงลึกถึงวิธีการเหล่านี้ เพราะคุณรู้ดีอยู่แล้ว คุณเดาได้ไหมว่าฉันกำลังทำอะไรอยู่?
จำได้System.out.println()ไหม ? แต่สามารถเขียนได้สองบรรทัด:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
คำสั่งโปรดของเราคือการเรียกเมธอดบนตัวแปรสแตติกของคลาส และประเภทของตัวแปรนี้คือSystem.out.println()println()outSystemPrintStream
ในหลายๆ ระดับของ CodeGym และในเกือบทุกงาน คุณเรียกใช้เมธอดของPrintStreamชั้นเรียนโดยไม่รู้ตัว!
ใช้งานได้จริง
Java มีคลาสที่น่าสนใจที่เรียกว่าByteArrayOutputStreamซึ่งเป็นอาร์เรย์ไบต์ที่เพิ่มขึ้นแบบไดนามิกที่สืบทอดOutputStream.
วัตถุByteArrayOutputStreamและPrintStreamวัตถุสามารถเชื่อมโยงได้ดังนี้:
| รหัส | คำอธิบาย |
|---|---|
|
สร้างบัฟเฟอร์การเขียนในหน่วยความจำ ห่อบัฟเฟอร์ใน PrintStreamวัตถุเขียนข้อมูลไปยังคอนโซล แปลงอาร์เรย์เป็นสตริง! เอาต์พุตคอนโซล: |
GO TO FULL VERSION