Câu trả lời:
Từ các tài liệu của flush
phương pháp:
Xả luồng đầu ra và buộc mọi byte đầu ra có bộ đệm phải được ghi ra ngoài. Hợp đồng chung của flush là việc gọi nó là một dấu hiệu rằng, nếu bất kỳ byte nào được viết trước đó đã được đệm bởi việc thực hiện luồng đầu ra, các byte đó sẽ ngay lập tức được ghi vào đích dự kiến của chúng.
Bộ đệm chủ yếu được thực hiện để cải thiện hiệu suất I / O. Bạn có thể đọc thêm về điều này từ bài viết này: Điều chỉnh Hiệu suất I / O của Java .
Khi chúng ta đưa ra bất kỳ lệnh nào, các luồng lệnh đó được lưu trữ trong vị trí bộ nhớ được gọi là bộ đệm (vị trí bộ nhớ tạm thời) trong máy tính của chúng ta. Khi tất cả vị trí bộ nhớ tạm thời đầy thì chúng ta sử dụng flush (), nó sẽ xóa tất cả các luồng dữ liệu và thực thi chúng hoàn toàn và cung cấp một không gian mới cho các luồng mới trong vị trí tạm thời của bộ đệm. -Hy vọng bạn sẽ hiểu
BufferedOutputStream
, BufferedWriter
, ObjectOutputStream,
và PrintXXX
các lớp học. Các flush()
phương pháp của bất kỳ dòng khác hoặc Writer
không có gì.
flush()
Không bắt buộc phải gọi một cách rõ ràng đối với a BufferedWriter
, miễn là bạn close()
là người viết. close()
tự thực hiện xả nước.
close()
cuộc gọi flush()
, vì vậy gọi cả hai là dư thừa khi sử dụng FileWriter
không có bộ đệm.
Khi bạn ghi dữ liệu vào một luồng, nó không được ghi ngay lập tức và nó được lưu vào bộ đệm. Vì vậy, hãy sử dụng flush()
khi bạn cần đảm bảo rằng tất cả dữ liệu của bạn từ bộ đệm đã được ghi.
Chúng tôi cần đảm bảo rằng tất cả các quá trình ghi đã được hoàn thành trước khi chúng tôi đóng luồng và đó là lý do tại sao flush()
nó được gọi trong tệp / người viết có đệm close()
.
Nhưng nếu bạn có yêu cầu rằng tất cả các bài viết của bạn được lưu bất cứ lúc nào trước khi bạn đóng luồng, hãy sử dụng flush()
.
FilterOutputStream
và FilterWriter
.
Nếu bộ đệm đầy, tất cả các chuỗi được đệm trên đó, chúng sẽ được lưu vào đĩa. Bộ đệm được sử dụng để tránh khỏi các Giao dịch lớn! và chi phí.
Trong lớp BufferedWriter được đặt trong java libs, có một dòng như:
private static int defaultCharBufferSize = 8192;
Nếu bạn muốn gửi dữ liệu trước khi bộ đệm đầy, bạn có quyền kiểm soát. Chỉ cần xả nó. Các cuộc gọi tới writer.flush () nói rằng, "hãy gửi bất cứ thứ gì trong bộ đệm ngay bây giờ!
sách tham khảo: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208
trang: 453
Các luồng thường được truy cập bởi các luồng định kỳ làm trống nội dung của chúng và ví dụ: hiển thị nó trên màn hình, gửi nó đến một ổ cắm hoặc ghi nó vào một tệp. Điều này được thực hiện vì lý do hiệu suất. Xả một luồng đầu ra có nghĩa là bạn muốn dừng lại, đợi nội dung của luồng được chuyển hoàn toàn đến đích của nó, sau đó tiếp tục thực thi với luồng trống và nội dung đã được gửi.
Đối với vấn đề hiệu suất, dữ liệu đầu tiên phải được ghi vào Bộ đệm. Khi bộ đệm đầy thì dữ liệu được ghi vào đầu ra (Tệp, bảng điều khiển, v.v.). Khi bộ đệm được lấp đầy một phần và bạn muốn gửi nó đến đầu ra (tệp, bảng điều khiển) thì bạn cần gọi phương thức flush () theo cách thủ công để ghi bộ đệm được lấp đầy một phần vào đầu ra (tệp, bảng điều khiển).