2010-02-26 137 views

Trả lời

65

Từ docs của phương pháp flush:

sẽ xóa output stream và buộc bất kỳ byte đầu ra đệm được viết ra. Các hợp đồng chung của tuôn ra là gọi nó là một dấu hiệu cho thấy, nếu bất kỳ byte trước đó bằng văn bản đã được đệm bởi việc thực hiện các dòng đầu ra, các byte như vậy ngay lập tức nên được ghi vào đích dự định của họ.

Việc lưu vào bộ đệm được thực hiện chủ yếu để cải thiện hiệu suất I/O. Thông tin thêm về điều này có thể được đọc từ bài viết này: Tuning Java I/O Performance.

+1

tươi để chỉnh Java I/O Hiệu suất http://www.oracle.com/technetwork/articles/javase/perftuning-137844.html – Oleksandr

+0

+1 Cảm ơn bạn. Tôi không thể hiểu tại sao byte của tôi không được gửi đi, và đó là bởi vì tôi phải tuôn ra bộ đệm của mình. – rayryeng

+1

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

3

Luồng thường được truy cập theo chủ đề định kỳ làm trống nội dung của chúng và, ví dụ: hiển thị nội dung trên màn hình, gửi vào ổ cắm hoặc ghi vào tệp. Điều này được thực hiện vì lý do hiệu suất. Xảy ra luồng đầu ra có nghĩa là bạn muốn dừng lại, đợi cho nội dung của luồng được chuyển hoàn toàn đến đích, sau đó tiếp tục thực hiện với luồng trống và nội dung được gửi.

+1

Đâ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 dụng được tạo bởi ứng dụng. – EJP

14

Khi bạn ghi dữ liệu vào luồng, nó không được ghi ngay lập tức và được đệm. Vì vậy, sử dụng flush() khi bạn cần phải chắc chắn rằng tất cả dữ liệu của bạn từ bộ đệm được viết.

Chúng ta cần chắc chắn rằng tất cả các ghi được hoàn thành trước khi chúng ta đóng luồng, và đó là lý do tại sao flush() được gọi trong tệp đóng của trình soạn thảo/đệm().

Nhưng nếu bạn có một yêu cầu rằng tất cả viết của bạn được lưu bất cứ lúc nào trước khi bạn đóng dòng, sử dụng flush()

+2

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

+2

@BimanTripathy Tôi có thể nói rằng với sự đảm bảo 100%. Nó được đảm bảo bởi Javadoc của 'FilterOutputStream' và' FilterWriter'. – EJP

+0

có, gọi tuôn ra trước khi đóng là dư thừa. –

20

khi chúng ta đưa ra bất cứ lệnh, các dòng lệnh được lưu trữ trong bộ đệm vị trí bộ nhớ được gọi là (vị trí bộ nhớ tạm thời) trong máy tính của chúng tôi. Khi tất cả vị trí bộ nhớ tạm thời đầy, chúng tôi sử dụng lệnh flush() để 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ùng đệm tạm thời -Hope bạn sẽ hiểu được

+0

Chỉ trong trường hợp các lớp 'BufferedOutputStream',' BufferedWriter', 'ObjectOutputStream,' và 'PrintXXX'. Phương thức 'flush()' của bất kỳ luồng nào khác hoặc 'Writer' không làm gì cả. – EJP

+0

@EJP Bất kỳ tham chiếu nào để sao lưu các câu lệnh của bạn? Nó sẽ là hữu ích cho chúng tôi newbies :) – mr5

+1

@ mr5 Nó là poster người cần phải sao lưu báo cáo của mình, không phải tôi, nhưng tất cả mọi thứ tôi đã nói được nêu rõ trong Javadoc – EJP

2

Đối với vấn đề hiệu suất, dữ liệu đầu tiên sẽ được ghi vào Bộ đệm. Khi bộ đệm nhận được đầ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 điền 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 điền một phần vào đầu ra (tệp, bảng điều khiển).

3

Nếu bộ đệm đầy, tất cả các chuỗi được lưu vào bộ đệm, chúng sẽ được lưu vào đĩa. Bộ đệm được sử dụng để tránh khỏi Ưu đãi lớn! và trên cao.

Trong lớp BufferedWriter được đặt trong libs java, 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 đến writer.flush() nói, "gửi bất cứ điều gì trong bộ đệm, ngay bây giờ!

tham khảo cuốn sách: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

trang: liên kết 453

Các vấn đề liên quan