"สวัสดี Amigo! วันนี้เราจะมาทำความรู้จักกับอินพุต/เอาท์พุตสตรีมเราเลือกหัวข้อนี้เมื่อสองสามวันก่อน แต่วันนี้เราจะมาสำรวจอย่างละเอียด สตรีมอินพุต/เอาท์พุตแบ่งออกเป็น 4 ประเภท:"
1) สตรีมถูกแบ่งตามทิศทาง: สตรีมอินพุตและสตรีมเอาต์พุต
2) สตรีมถูกแบ่งตามประเภทข้อมูล: สตรีมที่ทำงานกับไบต์และสตรีมที่ทำงานกับอักขระ
นี่คือหน่วยงานเหล่านี้แสดงในตาราง:
กระแสอินพุต | กระแสเอาต์พุต | |
---|---|---|
ทำงานร่วมกับไบต์ | อินพุตสตรีม | เอาท์พุตสตรีม |
ทำงานร่วมกับตัวละคร | ผู้อ่าน | นักเขียน |
หากวัตถุใช้ อินเทอร์เฟ ซ InputStreamก็จะสนับสนุนความสามารถในการอ่านไบต์ตามลำดับจากวัตถุนั้น
หากวัตถุใช้ อินเทอร์เฟ ซ OutputStreamแสดงว่าวัตถุนั้นรองรับความสามารถในการเขียนไบต์ตามลำดับ
หากวัตถุใช้ อินเทอร์เฟ ซ Readerแสดงว่าวัตถุนั้นรองรับความสามารถในการอ่านอักขระตามลำดับ (ตัวอักษร) จากนั้น
หากวัตถุใช้ อินเทอร์เฟซ Writerแสดงว่าวัตถุนั้นรองรับความสามารถในการเขียนอักขระ (ตัวอักษร) ตามลำดับ
เอาต์พุตสตรีมเปรียบเสมือนเครื่องพิมพ์ เราสามารถส่งออกเอกสารไปยังเครื่องพิมพ์ เราสามารถส่งออกข้อมูลไปยังกระแสข้อมูลออก
ในส่วนของกระแสอินพุตสามารถเปรียบเทียบได้กับเครื่องสแกนหรืออาจเป็นเต้ารับไฟฟ้า ด้วยเครื่องสแกนเราสามารถนำเอกสารเข้าสู่คอมพิวเตอร์ของเราได้ หรือเราจะเสียบปลั๊กไฟแล้วรับไฟจากเต้ารับก็ได้ เราสามารถรับข้อมูลจากกระแสอินพุต
"ใช้ที่ไหน?"
"คลาสเหล่านี้ถูกใช้ทุกที่ใน Java System.in เพื่อนที่เราคุ้นเคย คือตัวแปรInputStream แบบคงที่ที่มีชื่อ อยู่ใน คลาส System "
"จริงเหรอ! ตลอดเวลานี้ฉันใช้ InputStream และไม่รู้ตัวด้วยซ้ำว่า System.out เป็นสตรีมด้วยหรือไม่"
"ใช่System.outเป็น ตัวแปร PrintStream แบบสแตติก (ลูกหลานของตัวแปร OutputStream ) ในคลาส System"
“เธอจะบอกว่าฉันใช้สตรีมมาตลอดโดยไม่รู้ตัวเลยเหรอ?”
"ใช่ และนั่นเป็นเพียงการบอกเราว่าสตรีมเหล่านี้สะดวกแค่ไหน คุณแค่หยิบมันขึ้นมาแล้วใช้มัน"
"แต่คุณไม่สามารถพูดแบบนั้นได้เกี่ยวกับ System.in เราต้องเพิ่ม BufferedReader หรือ InputStreamReader เข้าไป"
“นั่นก็จริง แต่ก็มีเหตุผลสำหรับเรื่องนั้นด้วย”
มีชนิดข้อมูลจำนวนมาก และมีวิธีการทำงานที่หลากหลาย ดังนั้นจำนวนคลาส I/O มาตรฐานจึงเพิ่มขึ้นอย่างรวดเร็ว แม้ว่าพวกเขาจะทำทุกอย่างในลักษณะเดียวกันเกือบทั้งหมด เพื่อหลีกเลี่ยงความซับซ้อนนี้ นักพัฒนา Java ใช้หลักการนามธรรมและแบ่งคลาสออกเป็นส่วนย่อยๆ
แต่คุณสามารถเชื่อมต่อชิ้นส่วนเหล่านี้ให้สอดคล้องกันและใช้งานฟังก์ชันที่ซับซ้อนได้หากต้องการ ดูตัวอย่างนี้:
ส่งออกสตริงไปยังคอนโซล |
|
เก็บสตรีมเอาท์พุตของคอนโซลไว้ในตัวแปรแยกต่างหาก ส่งออกสตริงไปยังสตรีม |
|
สร้างอาร์เรย์ไบต์แบบไดนามิก (ขยาย) ในหน่วยความจำ เชื่อมต่อกับเอาต์พุตสตรีมใหม่ (วัตถุ PrintStream) ส่งออกสตริงไปยังสตรีม |
|
"พูดตามตรง มันเหมือนกับชุดเลโก้ เพียงแต่ฉันไม่ชัดเจนว่ารหัสนี้ใช้ทำอะไร"
“อย่ากังวลกับเรื่องนั้นในตอนนี้ ทุกอย่างมีกำหนดของมันเอง”
นี่คือสิ่งที่ฉันต้องการให้คุณจำ: หากคลาสใช้อินเทอร์เฟซ OutputStream คุณสามารถเขียนไบต์ลงไปได้ เกือบจะเหมือนกับที่คุณส่งข้อมูลไปยังคอนโซล มันทำอะไรกับมันก็ธุรกิจของมัน ด้วย "ชุดต่อเลโก้" ของเรา เราไม่สนใจวัตถุประสงค์ของแต่ละชิ้นส่วน เราใส่ใจในข้อเท็จจริงที่ว่าชิ้นส่วนที่มีให้เลือกมากมายช่วยให้เราสร้างสิ่งที่ยอดเยี่ยมได้
"ตกลง แล้วเราจะเริ่มที่ไหน?"
GO TO FULL VERSION