2012-03-25 33 views
31

Theo tài liệu java, hãy gọi close() trên bất kỳ luồng java.io nào tự động gọi flush(). Nhưng tôi đã thấy trong rất nhiều ví dụ, ngay cả trong các mã sản xuất, các nhà phát triển đã sử dụng rõ ràng flush() ngay trước khi close(). Trong điều kiện nào chúng ta cần sử dụng flush() ngay trước close()?Dùng flush() trước khi đóng()

+1

Câu hỏi này có thể giúp bạn một chút [xem này] [1] [1]: http://stackoverflow.com/questions/7300676/when-to-use-flush-in- java –

+6

@Siva: 'theo Javadoc'. Trích dẫn và liên kết, hoặc nó không tồn tại. Theo như tôi biết, * một số * triển khai luồng sẽ tuôn ra khi đóng, trong khi những người khác thì không. Làm chứng minh cho tôi sai nếu đó không phải là trường hợp và Javadoc nói khác đi. – haylem

+3

Cùng một câu hỏi như haylem. Tôi đọc qua tài liệu Java API của một vài lớp và một số nói rằng 'flush()' được gọi trong 'close()' trong khi những người khác không đưa ra nhận xét nào như vậy. Bất kỳ liên kết? –

Trả lời

26

Nhà phát triển có thói quen gọi flush() sau khi viết nội dung nào đó phải được gửi đi.

IMHO Sử dụng tuôn ra() sau đó đóng() là phổ biến khi chỉ có một cách viết, ví dụ:

// write a message 
out.write(buffer, 0, size); 
out.flush(); 

// finished 
out.close(); 

Như bạn có thể thấy dấu() là thừa, nhưng có nghĩa là bạn đang theo dõi một mẫu.

+6

dự phòng + mẫu = chống mẫu? – Robino

+8

Tùy thuộc vào lớp implenting, điều này có thể không cần thiết. Ví dụ: nếu someinterface.getOutputStream() trả về một OutputStream, bạn có thể không biết nếu phương thức close gọi flush hay nếu phương thức flush là trống, nếu nó không được ghi rõ ràng. Ví dụ. URLConnection.getOutputStream(): https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html#getOutputStream-- – Puce

25

Tôi đoán trong nhiều trường hợp đó là vì họ không biết close() cũng gọi số flush(), vì vậy họ muốn được an toàn.

Dù sao, việc sử dụng luồng được lưu vào bộ đệm nên thực hiện xả tay thủ công gần như dư thừa.

+3

Được thăng hạng. Bất kỳ ai, trên thực tế, không nên giả định rằng tất cả 'close()' cũng gọi 'flush()'. –

-3

sử dụng phương thức flush() ngay lập tức ghi dữ liệu đệm vào đĩa (hoặc gần như ngay lập tức), vì vậy đôi khi bạn muốn đảm bảo rằng nội dung của bạn được lưu trữ trước khi đóng.

+0

Tôi nghĩ rằng bạn đang nhận được downvoted vì đó không thực sự là những gì OP được yêu cầu. Có thể cải thiện câu trả lời của bạn một chút? –

+4

Trạng thái Javadoc: "Nếu đích dự định của luồng này là trừu tượng được cung cấp bởi hệ điều hành cơ bản, ví dụ: tệp, sau đó xả luồng đảm bảo chỉ các byte được ghi trước đó luồng được chuyển đến hệ điều hành để ghi ; nó không đảm bảo rằng chúng thực sự được ghi vào một thiết bị vật lý như ổ đĩa. " 'flush()' chỉ đảm bảo rằng Java xóa bộ đệm của nó. Hệ điều hành có thể có của riêng mình. –

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