เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้กระแส IO และพบว่าฟังก์ชั่น Flush () ปรากฏขึ้นทุกครั้ง ฉันตรวจสอบฟังก์ชั่นของมันและฟังก์ชั่นหลักมีดังนี้
//------------------------------------------------------------------------------------
คำตอบทั่วไปและไม่ถูกต้อง:
ข้อมูลในบัฟเฟอร์จะถูกบันทึกไว้จนกว่าบัฟเฟอร์จะเต็ม นอกจากนี้คุณยังสามารถใช้วิธีการล้างเพื่อบังคับข้อมูลในบัฟเฟอร์ที่จะเขียนหรือใช้วิธีปิด () เพื่อปิดสตรีม ก่อนที่จะปิดสตรีมสตรีมเอาต์พุตบัฟเฟอร์จะเขียนข้อมูลบัฟเฟอร์ในครั้งเดียว flash () และ close () ทั้งสองบังคับให้ข้อมูลที่จะเขียนออกมาดังนั้นผลลัพธ์ทั้งสองจึงเหมือนกัน หากคุณไม่เขียนมันคุณจะพบว่าคุณไม่สามารถเขียนได้สำเร็จ
ในการตอบสนองต่อคำตอบข้างต้นได้รับคำตอบที่ถูกต้อง
FileOutputStream สืบทอดเอาท์พุทสตรีมและไม่ได้ให้การเขียนใหม่ของวิธีการล้าง () ดังนั้นไม่ว่าเนื้อหาจะเขียนมากแค่ไหนมันจะส่งผ่านไบนารีสตรีมโดยตรงไปยัง I/O ของระบบปฏิบัติการพื้นฐาน ฟลัชไม่มีผล ฟังก์ชั่นอินพุตและเอาต์พุตของซีรีย์บัฟเฟอร์สามารถมองเห็นได้จากคำว่าบัฟเฟอร์ที่ใช้บัฟเฟอร์ แอปพลิเคชันต้องสื่อสารกับอุปกรณ์ทุกครั้งที่ IO ซึ่งต่ำมาก ดังนั้นเพื่อปรับปรุงประสิทธิภาพบัฟเฟอร์จะถูกเขียนไปยังบัฟเฟอร์ก่อนเมื่อเขียนลงในอุปกรณ์ เมื่อบัฟเฟอร์มีข้อมูลเพียงพอมันจะถูกเขียนลงในอุปกรณ์โดยรวม
ใช้ bufferedxxxstream ขนาดบัฟเฟอร์เริ่มต้นคือ 8K เมื่ออ่านบัฟเฟอร์จะถูกเติม (หรือไฟล์ถูกอ่าน) ตลอดเวลา เมื่อเขียนเนื้อหาจะถูกส่งไปยังบัฟเฟอร์เคอร์เนลหลังจากบัฟเฟอร์เต็ม (หรือการดำเนินการล้าง) เหตุผลที่มีประสิทธิภาพสูงคือการหลีกเลี่ยงการตกอยู่ในเคอร์เนลระบบปฏิบัติการสำหรับการอ่านไบต์ทุกครั้ง (นี่คือการดำเนินการที่ใช้เวลานาน) สำหรับรหัสเฉพาะโปรดตรวจสอบ API ด้วยตัวเอง
ฉันจะแนบคำตอบคำถามจาก Baidu
Flush () หมายถึงการบังคับให้เนื้อหาของบัฟเฟอร์ถูกเขียนออกมา เนื่องจากกลไกบางอย่างของระบบปฏิบัติการเพื่อป้องกันการอ่านและการเขียนดิสก์อย่างต่อเนื่องจึงมีแนวคิดของการเขียนล่าช้า (ระวังอย่าสับสนกับผลไม้ () รีเฟรช) ส่วนใหญ่จะใช้ใน IO นั่นคือล้างข้อมูลบัฟเฟอร์ โดยทั่วไปเมื่ออ่านและเขียนสตรีมข้อมูลจะถูกอ่านเป็นหน่วยความจำก่อนแล้วเขียนลงในไฟล์ เมื่อคุณอ่านข้อมูลมันไม่ได้หมายความว่าข้อมูลของคุณถูกเขียนเพราะยังมีส่วนหนึ่งของข้อมูลที่อาจถูกทิ้งไว้ในบัฟเฟอร์หน่วยความจำ ในเวลานี้ถ้าคุณเรียกเมธอดปิด () เพื่อปิดสตรีมการอ่านและเขียนข้อมูลส่วนนี้จะหายไปดังนั้นคุณควรล้าง () ก่อนที่จะปิดการอ่านและเขียนสตรีม -
เช่นเดียวกันบนเว็บเซิร์ฟเวอร์เครือข่าย เพื่อป้องกันไม่ให้ข้อความถูกส่งหลังจากเขียนไบต์มีแนวคิดของบัฟเฟอร์เช่นพื้นที่หน่วยความจำ 64K เมื่อบัฟเฟอร์เต็มมันจะถูกเขียนลงในดิสก์ทันที (หรือส่งไปยังเบราว์เซอร์ลูกค้า)
วิธีการล้างจะถูกดำเนินการโดยทั่วไปเมื่อโปรแกรมเขียนเสร็จ จากนั้นทำตามวิธีการปิด ตัวอย่างเช่น:
// รับกระแสเอาต์พุต แน่นอนขึ้นอยู่กับสภาพแวดล้อมที่เฉพาะเจาะจง PrintWriter out = util.getWriter (); out.println ("เอาต์พุตข้อมูลบางอย่างอาจมาก"); out.flush (); out.close ();พูดง่ายๆคือวิธีการล้าง () คือการส่งออกเนื้อหาทั้งหมดที่เก็บไว้ในหน่วยความจำ (เอาต์พุตแบทช์) ตัวอย่างเช่นที่ใช้กันทั่วไปเป็นตัวอย่างทั่วไปในคลาส FileWriter นอกเหนือจากการใช้เอาต์พุตฟลัชแล้วการโทรขั้นสุดท้ายไปยังวิธีการปิดจะเป็นเอาต์พุตแบทช์
นำเข้า java.io.fileWriter; นำเข้า java.io.ioException; คลาสสาธารณะ A04 {โมฆะคงที่สาธารณะหลัก (สตริง args []) {fileWriter fw; ลอง {fw = ใหม่ fileWriter ("c: //try.txt"); fw.write ("hello"); // ประโยคนี้ไม่ได้เพิ่มไฟล์ไม่สามารถเขียนได้และไฟล์ว่างเปล่า! System.out.println ("ตกลง"); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); -สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับบทบาทและวิธีการใช้งานของฟังก์ชั่นการล้างในภาษา Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!