แนวคิดของ "สตรีม" มีต้นกำเนิดมาจากแนวคิดของไปป์ใน UNIX ใน UNIX ไพพ์คือสตรีมไบต์ที่ไม่หยุดชะงักซึ่งใช้เพื่อใช้การสื่อสารระหว่างโปรแกรมหรือกระบวนการ หรือเพื่ออ่านและเขียนอุปกรณ์ต่อพ่วง ไฟล์ภายนอก ฯลฯ โดยจะป้องกันรายละเอียดของการประมวลผลข้อมูลในอุปกรณ์ I/O จริง สตรีมต้องมีต้นทางและปลายทาง ซึ่งอาจเป็นจุดหนึ่งของหน่วยความจำคอมพิวเตอร์ ไฟล์ดิสก์ หรือแม้แต่ URL บนอินเทอร์เน็ต ทิศทางของการไหลมีความสำคัญ ตามทิศทางของการไหล การไหลสามารถแบ่งออกเป็นสองประเภท: การไหลเข้าและการไหลออก ในความเป็นจริงอินพุต/เอาท์พุตมีไว้สำหรับหน่วยความจำ ในความเป็นจริง ต้นทางและปลายทางของสตรีมถือได้ว่าเป็นผู้ผลิตและผู้บริโภคของไบต์ สำหรับสตรีมอินพุต คุณไม่จำเป็นต้องสนใจแหล่งที่มาของสตรีม ตราบใดที่คุณเพียงแค่อ่านข้อมูลจากสตรีม และ สำหรับสตรีมอินพุต สตรีมเอาต์พุตยังสามารถไม่ทราบถึงปลายทางและเพียงเขียนข้อมูลลงในสตรีม
ก. สตรีม: ชุดของลำดับข้อมูลที่เรียงลำดับ
b สตรีมไบต์: หน่วยข้อมูลที่เล็กที่สุดในสตรีมข้อมูลคือไบต์
ค. สตรีมอักขระ: หน่วยข้อมูลที่เล็กที่สุดในสตรีมข้อมูลคืออักขระ
1. คลาสในแพ็คเกจ java.io สอดคล้องกับสตรีมสองประเภท
สตรีมประเภทหนึ่งอ่านหรือเขียนโดยตรงจากตำแหน่งที่ระบุ (เช่น ไฟล์ดิสก์หรือพื้นที่หน่วยความจำ) สตรีมประเภทนี้เรียกว่าสตรีมโหนด และสตรีมอื่นๆ เรียกว่าสตรีมตัวกรอง (สตรีมแพ็คเกจ)
การกรองสตรีม: สตรีมบางรายการสามารถรับไบต์จากไฟล์และที่อื่น ๆ และสตรีมอื่น ๆ สามารถรวมไบต์เป็นประเภทข้อมูลที่มีประโยชน์มากกว่า ตัวสร้างที่ส่งกระแสข้อมูลที่มีอยู่ไปยังกระแสอื่นและรวมกระแสข้อมูลทั้งสองเข้าด้วยกัน เรียกว่ากระแสกรอง สตรีมอินพุตตัวกรองมักจะใช้สตรีมอินพุตอื่นเป็นแหล่งอินพุต หลังจากการกรองหรือการประมวลผล จะมีการจัดหาให้กับผู้ใช้ในรูปแบบของสตรีมอินพุตใหม่ สตรีมเอาต์พุตของตัวกรองจะคล้ายกัน เราไม่ค่อยใช้คลาสเดียวเพื่อสร้างออบเจ็กต์โฟลว์ แต่ให้ฟังก์ชันที่ต้องการโดยการซ้อนทับหลาย ๆ ออบเจ็กต์แทน (เช่น รูปแบบการออกแบบมัณฑนากร)
สตรีมอินพุตและเอาท์พุตที่ใช้กันทั่วไปของ Java นั้นแท้จริงแล้วสืบทอดมาจากคลาสนามธรรมสี่คลาส ซึ่งได้แก่:
ขึ้นอยู่กับ InputStream ไบต์เดียว, คลาส OutputStream (I/O เชิงไบต์)
คลาส Reader และ Writer ขึ้นอยู่กับหน่วยโค้ด Unicode แบบไบต์คู่ (I/O ที่เน้นอักขระ)
เมื่อสตรีมอินพุตเปิดขึ้น โปรแกรมสามารถอ่านข้อมูลตามลำดับจากสตรีมอินพุตได้ กระบวนการอ่าน/เขียนข้อมูลจากสตรีมอินพุตโดยทั่วไปจะเป็นดังนี้: เปิดช่องสตรีม --> อ่าน/เขียนข้อมูล --> ปิดช่องสตรีม
ในแพลตฟอร์ม Java มีสองวิธีในการรับประเภทการเข้ารหัสอักขระของแพลตฟอร์มโลคัล:
(ก) System.getProperty("file.encoding");
(ข) ชุดอักขระ cs=Charset.defaultCharset();
สตรีมอินพุตและสตรีมเอาท์พุตทั้งหมดสามารถแบ่งออกเป็นสตรีมไบต์ (อินพุต, เอาท์พุต) และสตรีมอักขระ (อินพุต, เอาท์พุต) ไบต์ที่ประมวลผลส่วนใหญ่เป็นซีรีส์ (OutputStream/InputStream) และสตรีมที่ประมวลผลส่วนใหญ่เป็น (โปรแกรมอ่าน/เขียน) ) ชุด
2. สตรีมอินพุตแบบไบต์ (ซีรี่ส์ InputStream) คลาสเหล่านี้สามารถเชื่อมต่อกับออบเจ็กต์ FileInputStream เพื่อให้อินเทอร์เฟซที่มีประโยชน์:
ByteArrayInputStream: ใช้บัฟเฟอร์ในหน่วยความจำเป็น InputStream
StringBufferInputStream (เลิกใช้แล้วใน java1.1): ใช้วัตถุ String เป็น InputStream และการใช้งานพื้นฐานใช้ StringBuffer
FileInputStream: ใช้ไฟล์เป็น InputStream เพื่อดำเนินการอ่านไฟล์ (ชื่อไฟล์, ไฟล์, อ็อบเจ็กต์ FileDescriptor)
PipedInputStream: นำแนวคิดของไปป์ไปใช้ ซึ่งส่วนใหญ่ใช้ในเธรด (เป็นแหล่งข้อมูลในหลายกระบวนการ)
SequenceInputStream: รวม InputStream หลายรายการไว้ใน InputStream เดียว
สตรีมเอาต์พุตเชิงไบต์ (ซีรีส์ OutputStream) สามารถเชื่อมต่อกับออบเจ็กต์ FilterOutputStream เพื่อให้อินเทอร์เฟซที่มีประโยชน์:
ByteArrayOutputStream: สร้างบัฟเฟอร์ในหน่วยความจำ จัดเก็บข้อมูลในบัฟเฟอร์ในหน่วยความจำ และเริ่มต้นขนาดบัฟเฟอร์ (ไม่จำเป็น)
FileOutputStream: เก็บข้อมูลไว้ในไฟล์ (ชื่อไฟล์, ไฟล์, FileDescriptor)
PipedOutputStream: นำแนวคิดของไปป์ไปใช้ ซึ่งส่วนใหญ่ใช้ในเธรด (ระบุปลายทางของข้อมูลสำหรับหลายเธรด)
3. ซีรี่ส์ (Reader/Writer) ที่เกี่ยวข้อง :
ผู้อ่าน: สอดคล้องกับ InputStream, อะแดปเตอร์ InputStreamReader
ตัวเขียน: สอดคล้องกับ OutputStream และอะแดปเตอร์คือ OutputStreamWriter
FileReader: สอดคล้องกับ FileOutputStream
FileWriter: สอดคล้องกับ FileOURputStream
StringReader: ไม่มีคลาสที่เกี่ยวข้อง
StringWriter: สอดคล้องกับ ByteArrayInputStream
CharArrayReader: สอดคล้องกับ ByteArrayOutputStream
CharArrayWriter: สอดคล้องกับ ByteArrayOutputStream
PipedReader: สอดคล้องกับ PipedInputStream
PipedWriter: สอดคล้องกับ PipedOutputStream
4. การแปลงระหว่างสองสตรีมที่ไม่ จำกัด ( โดยใช้คลาสอะแดปเตอร์)
InputStreamReader และ OutputStreamReader: แปลงสตรีมแบบไบต์ให้เป็นสตรีมแบบอักขระ
InputStreamReader เป็นบริดจ์จากสตรีมไบต์ไปยังสตรีมอักขระ โดยอ่านไบต์โดยใช้ชุดอักขระที่ระบุและถอดรหัสเป็นอักขระ ชุดอักขระที่ใช้สามารถระบุด้วยชื่อหรือกำหนดไว้อย่างชัดเจน หรืออาจยอมรับชุดอักขระเริ่มต้นของแพลตฟอร์มก็ได้
OutputStreamWriter เป็นสะพานเชื่อมจากสตรีมอักขระไปยังสตรีมไบต์: อักขระที่จะเขียนลงในสตรีมสามารถเข้ารหัสเป็นไบต์ได้โดยใช้ชุดอักขระที่ระบุ ชุดอักขระที่ใช้สามารถระบุด้วยชื่อหรือกำหนดไว้อย่างชัดเจน ไม่เช่นนั้นชุดอักขระเริ่มต้นของแพลตฟอร์มจะได้รับการยอมรับ
5. อ่านข้อมูลจาก InputStream ผ่าน FilterInputStream :
DataInputStream: อ่านข้อมูลประเภทพื้นฐาน (int, char, long ฯลฯ) จากสตรีม
BufferedInputStream: ใช้บัฟเฟอร์เพื่อป้องกันไม่ให้ต้องดำเนินการอ่านจริงทุกครั้ง
LineNumberInputStream: จะบันทึกจำนวนบรรทัดในอินพุตสตรีม จากนั้นเรียก getLineNumber() และ setLineNumber(int)
PushbackInputStream: ไม่ค่อยได้ใช้ โดยทั่วไปใช้สำหรับการพัฒนาคอมไพเลอร์
เขียนไปยัง OutputStream ผ่าน FilterOutputStream:
DataIOutputStream: ข้อมูลประเภทพื้นฐาน (int, char, long ฯลฯ) สามารถส่งออกไปยังสตรีมได้ตามวิธีการปลูกถ่าย
BufferedOutputStream: ใช้บัฟเฟอร์เพื่อหลีกเลี่ยงการเขียนจริงทุกครั้งที่คุณส่งข้อมูล
PrintStream: สร้างเอาต์พุตที่จัดรูปแบบ โดยที่ DataOutputStream จัดการการจัดเก็บข้อมูล และ PrintStream จัดการการแสดงผล
6. เปลี่ยนพฤติกรรมของสตรีม
แม้ว่า BufferedOutputStream จะเป็นคลาสย่อยของ FilterOutputStream แต่ BufferedWriter ไม่ใช่คลาสย่อยของ FilterWriter (FilterWriter เป็นคลาสนามธรรมและไม่มีคลาสย่อยใด ๆ )
ไม่มีคลาสที่สอดคล้องกันสำหรับ DataInputStream ใช้ DataInputStream เว้นแต่คุณจะใช้ BufferedReader แทนเมื่อคุณต้องการใช้ readLine()
BufferedReader: สอดคล้องกับ BufferedInputStream
LineNumberReader: สอดคล้องกับ LineNumberInputStream
PushBackReader: สอดคล้องกับ PushbackInputStream
BufferedWrite: สอดคล้องกับ BufferedOutStream
PrintWrite: สอดคล้องกับ PrintStream
7. คลาสอิสระ: RandomAccessFile
คลาสนี้เหมาะสำหรับไฟล์ที่ประกอบด้วยบันทึกที่มีขนาดที่รู้จัก นอกเหนือจากการใช้อินเทอร์เฟซ DataInput และ DataOutput (DataInputStream และ DataOutputStream ยังใช้อินเทอร์เฟซทั้งสองนี้ด้วย) RandomAccessFile ยังเป็นคลาสอิสระโดยสมบูรณ์และมี I/O ประเภทอื่น ๆ อีกด้วย พฤติกรรมที่แตกต่างกัน สามารถเลื่อนไปข้างหน้าและข้างหลังภายในไฟล์ และได้รับมาจากวัตถุโดยตรง
การดำเนินการอ่านและเขียนไฟล์สามารถทำได้ผ่านอ็อบเจ็กต์ RandomAccessFile
เมื่อสร้างอ็อบเจ็กต์ คุณสามารถระบุลักษณะของไฟล์ที่จะเปิดได้: r, read-only; w, write-only;
คุณสามารถข้ามไปยังตำแหน่งที่ระบุในไฟล์ได้โดยตรง
ฟังก์ชันการทำงานส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด) ของ RandomAccessFile ถูกแทนที่ด้วยไฟล์การแมปหน่วยเก็บข้อมูล nio