Java Io เป็นจุดความรู้ที่ยิ่งใหญ่
หากคุณทำลายคะแนนความรู้และพูดคุยเกี่ยวกับมันมันอาจจะเป็นสัปดาห์ สำหรับระบบ IO คุณสามารถดูภาพต่อไปนี้
ถัดไปเริ่มต้นด้วยรหัสชิ้นหนึ่งมาดูรหัสต่อไปนี้
การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {ไฟล์ไฟล์ = ไฟล์ใหม่ ("text.txt"); if (! file.exists ()) {file.createnewFile (); } fileOutputStream fos = ใหม่ fileOutputStream (ไฟล์); BufferedOutputStream BOS = ใหม่ bufferedOutputStream (FOS); ไบต์ [] b = ไบต์ใหม่ [1024]; bos.write (b); bos.flush (); - สตรีมบัฟเฟอร์ถูกสร้างขึ้นในรหัสและจากนั้นข้อมูลความยาว Kb จะถูกเขียนลงในสตรีมและในที่สุดก็มีการเรียกวิธีการล้าง ()
นี่เป็นโค้ดที่ง่ายมากและเอาต์พุตสุดท้ายคือการสร้างไฟล์ข้อความ 1KB
แต่ถ้าเราแสดงความคิดเห็นบรรทัดสุดท้าย
//bos.flush ();
ขนาดข้อความที่สร้างขึ้นสุดท้ายจะกลายเป็น 0
ผลลัพธ์นี้ชัดเจนมาก แต่ถ้าเราเปลี่ยน Flush () เป็นปิด () ผลลัพธ์จะยังคงเป็น 0 หรือไม่?
เกี่ยวกับ Flush
Flush () พบได้จริงในการส่งเครือข่ายเมื่อนานมาแล้ว
ในเวลานั้นเพื่อประสิทธิภาพเซิร์ฟเวอร์และไคลเอนต์จะไม่ส่งข้อมูลชิ้นส่วนทุกครั้งที่สร้างขึ้น
แต่จะมีการสร้างบัฟเฟอร์และข้อมูลจะถูกถ่ายโอนไปยังไคลเอนต์หลังจากบัฟเฟอร์เต็ม
บางครั้งมีปัญหาเช่นนี้ เมื่อข้อมูลไม่เพียงพอที่จะเติมบัฟเฟอร์และข้อมูลจะต้องส่งไปยังลูกค้าเพื่อแก้ปัญหานี้มีแนวคิดเรื่องการล้างและข้อมูลบัฟเฟอร์ถูกบังคับให้ส่ง
ย้อนกลับไปที่คำถามข้างต้นมันเป็นไปได้ไหมที่จะแทนที่ Flush ด้วยการปิด
คำตอบคือใช่
หากคุณดูที่ซอร์สโค้ดคุณจะทราบถึงความสัมพันธ์ในการสืบทอดของ BufferedOutputStream
คลาสสาธารณะ BufferOutputStream ขยาย FilterOutputStream
BufferedOutputStream ไม่ได้ใช้วิธีการปิด () ดังนั้นจึงจะเรียกปิด () ของ FilterOutputStream โดยตรงและวิธีการปิด () ของ FilterOutputStream จะเรียก Flush () เพื่อส่งออกข้อมูลบัฟเฟอร์
ในการพัฒนาที่เกิดขึ้นจริงเกี่ยวกับการดำเนินงานของ IO จะเน้นว่าวิธีการปิด () จะต้องเรียกในที่สุด ตัวอย่างข้างต้นเป็นหนึ่งในเหตุผล