Mục đích của flush () trong các luồng Java là gì?


121

Trong Java, flush()phương thức được sử dụng trong các luồng. Nhưng tôi không hiểu tất cả mục đích của việc sử dụng phương pháp này là gì?

fin.flush();

cho tôi biết một số gợi ý.

Câu trả lời:


101

Từ các tài liệu của flushphươ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 .


1
Liên kết mới đến Điều chỉnh Java I / O Performance oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1 Cảm ơn bạn. Tôi không thể tìm ra lý do tại sao các byte của mình không được gửi đi và đó là do tôi phải xả bộ đệm của mình.
rayryeng

3
Phương pháp tuôn ra chỉ được sử dụng với các luồng được đệm? có lợi thế nào khi sử dụng nó với các luồng khác (ví dụ: luồng đầu ra)?
tnishada

Có lẽ từ 'tuôn ra' không nên có trong định nghĩa của nó. Định nghĩa đệ quy là một ý tưởng tồi để hiểu những điều mới. Tôi biết rằng bạn đã không viết định nghĩa.
Jonathan Komar

27

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


1
Chỉ trong trường hợp BufferedOutputStream, BufferedWriter, ObjectOutputStream,PrintXXXcác lớp học. Các flush()phương pháp của bất kỳ dòng khác hoặc Writerkhông có gì.
Marquis of Lorne,

@EJP Bất kỳ tham chiếu nào để sao lưu các báo cáo của bạn? Nó sẽ rất hữu ích đối với chúng tôi người mới :)
mr5

1
@ mr5 Đây là tấm áp phích có nhu cầu sao lưu báo cáo của mình, không phải là tôi, nhưng tất cả những gì tôi đã nói được nêu rõ tại Javadoc
Marquis của Lorne

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.
Yossarian42

Lưu ý close()cuộc gọi flush(), vì vậy gọi cả hai là dư thừa khi sử dụng FileWriterkhông có bộ đệm.
Yossarian 42

26

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().


8
Gọi flush ngay trước khi đóng là thừa, phải không? nó cũng giống như chỉ đơn giản là gọi gần.
John Henckel

2
@BimanTripathy Tôi có thể nói điều đó với sự đảm bảo 100%. Nó được đảm bảo bởi Javadoc của FilterOutputStreamFilterWriter.
Marquis of Lorne,

7

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


4

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.


5
Đây là tưởng tượng. Các luồng không được truy cập bởi bất kỳ luồng ma thuật nào; chỉ những người được tạo bởi ứng dụng.
Marquis of Lorne

3

Đố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).


Đây không phải là sự thật. FileOutputStream.flush () là một no-op trống.
vertuso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.