ใน Java flush()
ใช้วิธีการในสตรีม แต่ฉันไม่เข้าใจว่าจุดประสงค์ของการใช้วิธีนี้คืออะไร?
fin.flush();
บอกคำแนะนำหน่อย
ใน Java flush()
ใช้วิธีการในสตรีม แต่ฉันไม่เข้าใจว่าจุดประสงค์ของการใช้วิธีนี้คืออะไร?
fin.flush();
บอกคำแนะนำหน่อย
คำตอบ:
จากเอกสารของflush
วิธีการ:
ล้างสตรีมเอาต์พุตและบังคับให้เขียนไบต์เอาต์พุตที่บัฟเฟอร์ สัญญาทั่วไปของการล้างคือการเรียกมันเป็นการบ่งชี้ว่าหากไบต์ใด ๆ ที่เขียนไว้ก่อนหน้านี้ถูกบัฟเฟอร์โดยการนำเอาท์พุทสตรีมไปใช้งานไบต์ดังกล่าวควรถูกเขียนไปยังปลายทางที่ต้องการทันที
การบัฟเฟอร์ส่วนใหญ่ทำเพื่อปรับปรุงประสิทธิภาพ I / O เพิ่มเติมเกี่ยวกับเรื่องนี้สามารถอ่านได้จากบทความนี้: ปรับแต่ง Java I / O ที่ผลการดำเนินงาน
เมื่อเราให้คำสั่งสตรีมของคำสั่งนั้นจะถูกเก็บไว้ในตำแหน่งหน่วยความจำที่เรียกว่าบัฟเฟอร์ (ตำแหน่งหน่วยความจำชั่วคราว) ในคอมพิวเตอร์ของเรา เมื่อตำแหน่งหน่วยความจำชั่วคราวทั้งหมดเต็มเราจะใช้ flush () ซึ่งจะล้างสตรีมข้อมูลทั้งหมดและดำเนินการอย่างสมบูรณ์และให้พื้นที่ใหม่แก่สตรีมใหม่ในตำแหน่งชั่วคราวบัฟเฟอร์ - หวังว่าคุณจะเข้าใจ
BufferedOutputStream
, BufferedWriter
, ObjectOutputStream,
และPrintXXX
ชั้นเรียน flush()
วิธีการสตรีมอื่น ๆ หรือWriter
ไม่ทำอะไรเลย
flush()
ไม่จำเป็นต้องเรียกอย่างชัดเจนสำหรับ a BufferedWriter
ตราบใดที่คุณclose()
เป็นนักเขียน close()
ดำเนินการล้างตัวเอง
close()
โทรflush()
ดังนั้นการโทรทั้งสองจะซ้ำซ้อนเมื่อใช้FileWriter
โดยไม่มีบัฟเฟอร์
เมื่อคุณเขียนข้อมูลไปยังสตรีมข้อมูลจะไม่ถูกเขียนในทันทีและจะถูกบัฟเฟอร์ ดังนั้นใช้flush()
เมื่อคุณต้องการให้แน่ใจว่าข้อมูลทั้งหมดของคุณจากบัฟเฟอร์ถูกเขียน
เราจำเป็นต้องให้แน่ใจว่าเขียนทั้งหมดจะเสร็จสมบูรณ์ก่อนที่เราจะปิดกระแสและนั่นคือเหตุผลที่flush()
เรียกว่าในไฟล์ / close()
นักเขียนของบัฟเฟอร์
flush()
แต่ถ้าคุณมีความต้องการที่ทุกเขียนของคุณจะถูกบันทึกไว้ได้ตลอดเวลาก่อนที่คุณปิดกระแสการใช้งาน
FilterOutputStream
FilterWriter
หากบัฟเฟอร์เต็มสตริงทั้งหมดที่ถูกบัฟเฟอร์ไว้สตริงเหล่านั้นจะถูกบันทึกลงในดิสก์ บัฟเฟอร์ใช้เพื่อหลีกเลี่ยงจากข้อเสนอพิเศษ! และค่าใช้จ่าย
ในคลาส BufferedWriter ที่อยู่ใน java libs มีบรรทัดเดียวเช่น:
private static int defaultCharBufferSize = 8192;
หากคุณไม่ต้องการส่งข้อมูลก่อนที่บัฟเฟอร์จะเต็มคุณจะสามารถควบคุมได้ เพียงแค่ล้างมัน โทรไปที่ writer.flush () พูดว่า "ส่งอะไรก็ได้ในบัฟเฟอร์เดี๋ยวนี้!
หนังสืออ้างอิง: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208
หน้า: 453
สตรีมมักจะเข้าถึงได้โดยเธรดที่ว่างเนื้อหาเป็นระยะ ๆ และตัวอย่างเช่นแสดงบนหน้าจอส่งไปยังซ็อกเก็ตหรือเขียนลงในไฟล์ สิ่งนี้ทำด้วยเหตุผลด้านประสิทธิภาพ การล้างสตรีมเอาท์พุตหมายความว่าคุณต้องการหยุดรอให้เนื้อหาของสตรีมถูกโอนไปยังปลายทางอย่างสมบูรณ์จากนั้นดำเนินการต่อโดยที่สตรีมว่างเปล่าและเนื้อหาที่ส่ง
สำหรับปัญหาด้านประสิทธิภาพข้อมูลแรกจะถูกเขียนลงในบัฟเฟอร์ เมื่อบัฟเฟอร์เต็มข้อมูลจะถูกเขียนไปยังเอาต์พุต (ไฟล์คอนโซล ฯลฯ ) เมื่อบัฟเฟอร์ถูกเติมบางส่วนและคุณต้องการส่งไปยังเอาต์พุต (ไฟล์คอนโซล) คุณต้องเรียกใช้เมธอด flush () ด้วยตนเองเพื่อเขียนบัฟเฟอร์ที่เติมบางส่วนไปยังเอาต์พุต (ไฟล์คอนโซล)