"สวัสดี Amigo! วันนี้เราจะมาทำความรู้จักกับอินพุต/เอาท์พุตสตรีมเราเลือกหัวข้อนี้เมื่อสองสามวันก่อน แต่วันนี้เราจะมาสำรวจอย่างละเอียด สตรีมอินพุต/เอาท์พุตแบ่งออกเป็น 4 ประเภท:"

1) สตรีมถูกแบ่งตามทิศทาง: สตรีมอินพุตและสตรีมเอาต์พุต

2) สตรีมถูกแบ่งตามประเภทข้อมูล: สตรีมที่ทำงานกับไบต์และสตรีมที่ทำงานกับอักขระ

นี่คือหน่วยงานเหล่านี้แสดงในตาราง:

กระแสอินพุต กระแสเอาต์พุต
ทำงานร่วมกับไบต์ อินพุตสตรีม เอาท์พุตสตรีม
ทำงานร่วมกับตัวละคร ผู้อ่าน นักเขียน

หากวัตถุใช้ อินเทอร์เฟ ซ InputStreamก็จะสนับสนุนความสามารถในการอ่านไบต์ตามลำดับจากวัตถุนั้น

หากวัตถุใช้ อินเทอร์เฟ ซ OutputStreamแสดงว่าวัตถุนั้นรองรับความสามารถในการเขียนไบต์ตามลำดับ

หากวัตถุใช้ อินเทอร์เฟ ซ Readerแสดงว่าวัตถุนั้นรองรับความสามารถในการอ่านอักขระตามลำดับ (ตัวอักษร) จากนั้น

หากวัตถุใช้ อินเทอร์เฟซ Writerแสดงว่าวัตถุนั้นรองรับความสามารถในการเขียนอักขระ (ตัวอักษร) ตามลำดับ

สตรีมอินพุต/เอาท์พุต - 1

เอาต์พุตสตรีมเปรียบเสมือนเครื่องพิมพ์ เราสามารถส่งออกเอกสารไปยังเครื่องพิมพ์ เราสามารถส่งออกข้อมูลไปยังกระแสข้อมูลออก

ในส่วนของกระแสอินพุตสามารถเปรียบเทียบได้กับเครื่องสแกนหรืออาจเป็นเต้ารับไฟฟ้า ด้วยเครื่องสแกนเราสามารถนำเอกสารเข้าสู่คอมพิวเตอร์ของเราได้ หรือเราจะเสียบปลั๊กไฟแล้วรับไฟจากเต้ารับก็ได้ เราสามารถรับข้อมูลจากกระแสอินพุต

"ใช้ที่ไหน?"

"คลาสเหล่านี้ถูกใช้ทุกที่ใน Java System.in เพื่อนที่เราคุ้นเคย คือตัวแปรInputStream แบบคงที่ที่มีชื่อ อยู่ใน คลาส System "

"จริงเหรอ! ตลอดเวลานี้ฉันใช้ InputStream และไม่รู้ตัวด้วยซ้ำว่า System.out เป็นสตรีมด้วยหรือไม่"

"ใช่System.outเป็น ตัวแปร PrintStream แบบสแตติก (ลูกหลานของตัวแปร OutputStream ) ในคลาส System"

“เธอจะบอกว่าฉันใช้สตรีมมาตลอดโดยไม่รู้ตัวเลยเหรอ?”

"ใช่ และนั่นเป็นเพียงการบอกเราว่าสตรีมเหล่านี้สะดวกแค่ไหน คุณแค่หยิบมันขึ้นมาแล้วใช้มัน"

"แต่คุณไม่สามารถพูดแบบนั้นได้เกี่ยวกับ System.in เราต้องเพิ่ม BufferedReader หรือ InputStreamReader เข้าไป"

“นั่นก็จริง แต่ก็มีเหตุผลสำหรับเรื่องนั้นด้วย”

มีชนิดข้อมูลจำนวนมาก และมีวิธีการทำงานที่หลากหลาย ดังนั้นจำนวนคลาส I/O มาตรฐานจึงเพิ่มขึ้นอย่างรวดเร็ว แม้ว่าพวกเขาจะทำทุกอย่างในลักษณะเดียวกันเกือบทั้งหมด เพื่อหลีกเลี่ยงความซับซ้อนนี้ นักพัฒนา Java ใช้หลักการนามธรรมและแบ่งคลาสออกเป็นส่วนย่อยๆ

แต่คุณสามารถเชื่อมต่อชิ้นส่วนเหล่านี้ให้สอดคล้องกันและใช้งานฟังก์ชันที่ซับซ้อนได้หากต้องการ ดูตัวอย่างนี้:

ส่งออกสตริงไปยังคอนโซล
System.out.println("Hello");
เก็บสตรีมเอาท์พุตของคอนโซลไว้ในตัวแปรแยกต่างหาก
ส่งออกสตริงไปยังสตรีม
PrintStream console = System.out;
console.println("Hello");
สร้างอาร์เรย์ไบต์แบบไดนามิก (ขยาย) ในหน่วยความจำ
เชื่อมต่อกับเอาต์พุตสตรีมใหม่ (วัตถุ PrintStream)
ส่งออกสตริงไปยังสตรีม
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"พูดตามตรง มันเหมือนกับชุดเลโก้ เพียงแต่ฉันไม่ชัดเจนว่ารหัสนี้ใช้ทำอะไร"

“อย่ากังวลกับเรื่องนั้นในตอนนี้ ทุกอย่างมีกำหนดของมันเอง”

นี่คือสิ่งที่ฉันต้องการให้คุณจำ: หากคลาสใช้อินเทอร์เฟซ OutputStream คุณสามารถเขียนไบต์ลงไปได้ เกือบจะเหมือนกับที่คุณส่งข้อมูลไปยังคอนโซล มันทำอะไรกับมันก็ธุรกิจของมัน ด้วย "ชุดต่อเลโก้" ของเรา เราไม่สนใจวัตถุประสงค์ของแต่ละชิ้นส่วน เราใส่ใจในข้อเท็จจริงที่ว่าชิ้นส่วนที่มีให้เลือกมากมายช่วยให้เราสร้างสิ่งที่ยอดเยี่ยมได้

"ตกลง แล้วเราจะเริ่มที่ไหน?"