สตรีมเป็นแนวคิดที่เป็นนามธรรมของลำดับไบต์
ไฟล์เป็นรูปแบบการจัดเก็บข้อมูลคงที่ของข้อมูลในขณะที่สตรีมอ้างถึงแบบฟอร์มเมื่อส่งข้อมูล
คลาสสตรีมแบ่งออกเป็นสองประเภทหลัก: คลาสสตรีมโหนดและคลาสสตรีมที่กรอง (เรียกอีกอย่างว่าคลาสสตรีมกระบวนการ)
คลาสที่สอดคล้องกับอุปกรณ์เป้าหมายเรียกว่าคลาสการไหลของโหนด โปรแกรมยังสามารถเรียกคลาสการไหลของโหนดผ่านระดับการไหลทางอ้อมเพื่อให้ได้การอ่านข้อมูลประเภทต่างๆที่ยืดหยุ่นและสะดวกยิ่งขึ้น คลาสการไหลทางอ้อมนี้เป็นคลาสการไหลของตัวกรอง (เรียกอีกอย่างว่าคลาสการประมวลผลโฟลว์คลาส) หรือคลาสบรรจุภัณฑ์
กระบวนการโทรของคลาส wrapper มีดังนี้:
ความสัมพันธ์ระหว่างการจำแนกการไหล
ไม่ว่าการจำแนกของสตรีมจะร่ำรวยและซับซ้อนเพียงใดรากของมันมาจากชั้นเรียนพื้นฐานสี่ชั้น ความสัมพันธ์ระหว่างสี่คลาสนี้มีดังนี้:
| สตรีมไบต์ | สตรีมตัวละคร | |
| สตรีมอินพุต | อินพุตสตรีม | ผู้อ่าน |
| กระแสเอาต์พุต | outputstream | นักเขียน |
Unicode เข้ารหัสอักขระที่เก็บไว้ใน Java และคลาสการประมวลผลสตรีมอักขระมีหน้าที่ในการแปลงสตรีมอักขระภายนอกรหัสภายนอกอื่น ๆ และสตรีมอักขระ Unicode ใน Java คลาส InputStreamReader และ OutputStreamWriter จัดการการแปลงของสตรีมอักขระและสตรีมไบต์ สตรีมอักขระ (สามารถจัดการกับบัฟเฟอร์ทีละครั้ง) มีประสิทธิภาพมากขึ้นในการดำเนินการครั้งเดียวมากกว่าสตรีมไบต์ (หนึ่งไบต์ต่อครั้ง)
อินพุตสตรีม
เนื่องจาก InputStream และ OutputStream เป็นคลาสที่งดเว้นจึงไม่สามารถระบุได้ว่าอุปกรณ์ IO ใดที่สอดคล้องกับ มีคลาสย่อยมากมายด้านล่างรวมถึงอุปกรณ์ IO ที่เฉพาะเจาะจงเช่นเครือข่าย, ท่อ, หน่วยความจำ, ไฟล์, ฯลฯ และวัตถุคลาสย่อยต่างๆที่ใช้ในโปรแกรมจริง
หมายเหตุ: เราเรียกแหล่งที่มาของ IO และเป้าหมายที่สอดคล้องกับคลาสโหนดโฟลว์โหนดสตรีม (โหนด)
หมายเหตุ: เมื่อเขียนเนื้อหาของไฟล์ A ถึงไฟล์ B โปรแกรมจะใช้คลาสเอาต์พุตหรือคลาสอินพุตสำหรับการทำงานของไฟล์ A คลาสอินพุตและเอาต์พุตสัมพันธ์กับโปรแกรมไม่ใช่ในนามของไฟล์ดังนั้นเราควรสร้างคลาสอินพุต
outputstream
เครื่องอ่าน/นักเขียนสตรีมที่เน้นตัวละคร
สตรีมที่กำกับโดยอักขระ Unicode หมายถึงการอ่านจากสตรีมหรือเขียนข้อมูลลงในสตรีมในอักขระ Unicode ในทำนองเดียวกันผู้อ่าน/นักเขียนก็ยังงดเว้นคลาส
ผู้อ่าน
นักเขียน
นำรหัสโปรแกรม IO กลับมาใช้ซ้ำ:
โดยปกติเมื่อเขียนโค้ดให้ใช้ -1 เป็นส่วนท้ายของอินพุตแป้นพิมพ์และอย่าใช้ระบบในฟังก์ชันที่เขียนโดยตรง มันเป็นเพียงว่าเมื่อเรียกฟังก์ชั่น System.in จะถูกส่งผ่านเป็นพารามิเตอร์ ด้วยวิธีนี้เมื่อเราต้องการอ่านข้อมูลจากไฟล์ในอนาคตเพื่อแทนที่อินพุตแป้นพิมพ์ด้วยตนเองเราสามารถใช้ฟังก์ชั่นนี้โดยตรงดังนั้นโปรแกรมไม่จำเป็นต้องทำการดัดแปลงมากเกินไปเพื่อให้ได้ผลของการเปลี่ยนแปลงและปรับเปลี่ยนการเปลี่ยนแปลง
การแปลงสตรีมไบต์และสตรีมอักขระ
InputStreamReader และ OutputStreamReader: แปลงสตรีมที่เน้นไบต์เป็นสตรีมที่มุ่งเน้นอักขระ
คลาส InputStreamReader เป็นบริดจ์จากสตรีมไบต์ไปยังสตรีมอักขระ: มันอ่านในไบต์และแปลงเป็นสตรีมอักขระตามวิธีการเข้ารหัสที่ระบุ
วิธีการเข้ารหัสที่ใช้อาจระบุด้วยชื่อหรือวิธีการเข้ารหัสเริ่มต้นที่ยอมรับได้บนแพลตฟอร์ม
การโทรแต่ละครั้งไปยังหนึ่งในวิธีการอ่าน () ของ inputstreamreader อาจทำให้หนึ่งหรือมากกว่าหนึ่งไบต์ที่จะอ่านจากสตรีมอินพุตไบต์ฐาน
เพื่อให้ได้ประสิทธิภาพที่สูงขึ้นให้พิจารณาการห่อหุ้ม InputStreamReader ด้วย bufferedReader
bufferedReader in = new bufferedReader (ใหม่ inputStreamReader (system.in));
สรุปการใช้งานการสตรีม Java
ฉันได้พบกับลำธาร Java มากมายในงานที่เป็นมืออาชีพมากที่สุดและบทสรุปมีดังนี้:
1. สร้างรูปแบบไปรษณีย์ สิ่งที่คุณพบคือการสร้างไฟล์ zip ใน servlet ส่งออกไปยังเว็บไคลเอนต์และดาวน์โหลดโดยตรง
Response.SetContentType ("แอปพลิเคชัน/ซิป"); Response.addheader ("เนื้อหา-การจัดสรร", "เอกสารแนบ; ชื่อไฟล์ =/" xxx.zip/ ""); zipoutputStream out = new ZipOutputStream (response.getOutputStream ()) สำหรับ () {zipentry entry = new Zipentry ("aa" + i ".dat"); out.putNewentry (รายการ); ไบต์ [] bt = s.getBytes (); out.writeBytes (bt, 0, bt.length ()); out.closeentry (); } out.flush (); out.close (); ZipOutputStream สืบทอดมาจาก java.io.filteroutputStream ดังนั้นการดำเนินการเขียนจริงจะถูกเขียนผ่านพารามิเตอร์เอาท์พุทสตรีมออก
การเขียนโมฆะของมัน (byte [] b, int ปิด, int len) ในที่สุดเรียกออกมาเขียน (b, ปิด, len);
หากคุณต้องการสร้างไฟล์ zip ให้เขียน zipoutputStream ใหม่ (ใหม่ fileOutputStream (พา ธ ));
2. การเขียนที่คล้ายกัน XML
XMLWriter Writer = New XMLWriter (ใหม่ FileOutputStream (พา ธ ), Formatter)
Writer.write (DOC) หลักการคล้ายกับข้างต้น
3. เขียนไฟล์ข้อความและเพิ่ม
printstream ps = new printstream (ใหม่ fileOutputStream (path, true), "utf-8") ps.println (s); // สามารถเขียนประเภทต่าง ๆ เช่นบูลีน, int, ฯลฯPrintsteam ยังสืบทอดมาจาก FilterOutputStream
dataOrtputStream out = new dataOutputStream (socket.getOutputStream ()); Out.writeBytes (BT); out.writeboolean (บูลีน V);
DataOrtputStream ยังเป็น FilterOutputStream
5. อ่านจากข้อความ
bufferedReader reader = new BufferedReader (ใหม่ filereader (เส้นทาง)); reader.readline ();
รูปแบบ bufferedReader เหมือนกับรูปแบบตัวกรองด้านบน มันเก็บวัตถุที่วัตถุผู้อ่านถูกส่งผ่านเป็นพารามิเตอร์และใช้ในการอ่านจริง
คลาสที่สอดคล้องกับ Java 1.0 ของ BufferedReader คือ BufferedInputStream ซึ่งเป็น FilterInputStream
6. อ่านจากซ็อกเก็ต
bufferedInputStream คือ = ใหม่ bufferedInputStream (socket.getInputStream ()); IS.READ (bt, 0, bt.length ());
สรุป:
ซีรีย์สตรีมคลาสฐานคืออินพุตสตรีมและเอาท์พุทสตรีม พวกเขาเป็นคลาสนามธรรมและวิธีการเดียวที่จำเป็นคือ (นำออกเป็นตัวอย่าง)
เป็นโมฆะเขียน (int b) พ่น IOException; โมฆะเขียน (ไบต์ b []) พ่น IOExceptionVoid เขียน (byte b [], int ปิด, int len)
สิ่งพื้นฐานที่สุดคือการดำเนินการไบต์ วิธีแรกดูเหมือนว่าจะเขียนจำนวนเต็ม แต่ในความเป็นจริงมันเขียนเพียงหนึ่งไบต์ (ต่ำสุดแปดบิต) คลาสย่อยของมันแบ่งออกเป็นสองชุดหนึ่งคือการใช้งานอุปกรณ์เอาต์พุตโดยตรง สิ่งที่เราพบข้างต้นคือไฟล์ (fileOutputStream) และ servlet output (servletOutputStream) สิ่งอื่น ๆ ที่ใช้กันทั่วไปคือ ByteArrayOutputStream ซึ่งดำเนินการโดยตรงในหน่วยความจำ
ถัดไปคือซีรี่ส์ FilterOutputStream ซึ่งได้รับพารามิเตอร์ที่นั่งวัตถุ OutputStream และการดำเนินการเขียนจริงเสร็จสมบูรณ์ผ่านวัตถุ ตัวอย่างเช่น ZipOutputStream มีหน้าที่รับผิดชอบในการสร้างข้อมูลที่ถูกบีบอัดเท่านั้น สำหรับว่าข้อมูลนี้ถูกเขียนลงในไฟล์หน่วยความจำหรือ servletResponse จะถูกกำหนดโดยพารามิเตอร์อินพุต นี่คือรูปแบบมัณฑนากร
การดำเนินการที่ใช้กันทั่วไปในซีรี่ส์ตัวกรอง ได้แก่ printstream (ให้พิมพ์, println, เขียน (บูลีน [int, char, string]) และในที่สุดก็ใช้วิธีการเขียน out.write เพื่อเขียนในไบต์
นอกจากนี้ยังมี DataOrtputStream ซึ่งให้ WriteByte/Writeboolean/Writedouble/WriteLong/WireTutf และวิธีอื่น ๆ
นอกจากนี้ยังมีซ็อกเก็ต/ซิปและสิ่งอื่น ๆ ที่ไม่ได้ใช้กันทั่วไป
การสตรีม Java นั้นสะดวกและซับซ้อนมาก ความซับซ้อนหมายถึงการใช้งานฟังก์ชั่นมักจะต้องใช้หลายคลาสและมีชุดค่าผสมหลายชุด มันยังคงต้องมีการสรุปในทางปฏิบัติ