2014-11-11 13 views
5

Tôi đọc câu hỏi này Using flush() before close() và câu trả lời được chấp nhận là điều này chỉ có nghĩa là bạn tuân theo mẫu.Chúng ta có thực sự cần gọi flush() ngay trước close() ngay hôm nay không?

Cũng giống như BufferedWriter#close() hoặc FilterOutputStream.#close(), nếu tất cả các đệm Suối/Writer sẽ gọi flush() của nó khi chúng ta gọi là close() và nếu chúng ta (dev và dev người sẽ xem xét mã) đều biết rằng, chúng ta thực sự vẫn cần điều này? Nếu có, lý do sẽ là gì?

+0

IMO, bạn không, nhưng điều này không có nghĩa đó là một ý tưởng tốt :-) nếu bạn chuyển từ Writer hay OutputStream thực hiện, bạn có thể chấm dứt hành vi bất ngờ có nếu bạn không tuôn những người cần nó. Bạn có thể tranh luận rằng có một số flush() es là một thiết kế JVM xấu, sau đó câu trả lời của tôi là "có thể" :-) Một điều khác mà chúng tôi có thể nghiên cứu về khả năng tương thích ngược, nếu các phiên bản trước của JVM cũng hoạt động tốt mà không có tuôn ra(). – Leo

+0

Chính xác bạn đang hỏi về điều gì, điều này không nằm trong câu hỏi mà bạn đang liên kết đến? – jarnbjo

+0

@ jarnbjo, tôi chỉ cần biết nếu đây chỉ là một công việc nhàn rỗi execpt rằng điều này chỉ tuân theo một quy tắc một cách rõ ràng? – Jaskey

Trả lời

2

Khi javadoc cho biết, bạn không cần cần để tự xả. Nhưng, nó vẫn còn tốt để làm, xem xét độc giả của bạn, và ý thức chung.

Rất ít chuyên gia biết javadoc bằng trái tim. Tôi sẽ không biết chắc chắn liệu luồng này có bị xóa hay không mà không tra cứu, và có lẽ tôi không đơn độc. Thấy rõ ràng cuộc gọi flush() làm cho điều này hoàn toàn rõ ràng, và do đó làm cho mã dễ đọc hơn.

Hơn nữa, tên phương pháp close() ngụ ý gì về đỏ bừng. Đó là giao diện Closeable, và tự nhiên, nó không nói gì về xả nước. Nếu bạn không tuôn ra luồng đầu ra được đệm trước khi đóng, bất chấp muốn xóa nó, bạn sẽ dựa vào các giả định có thể có hoặc không đúng. Nó sẽ làm suy yếu việc triển khai của bạn.

Bất kỳ giả định nào bạn thực hiện, bạn bằng cách nào đó sẽ chuyển sang các nhà bảo trì trong tương lai. Một cách để làm điều đó là bằng cách để lại bình luận:

// no need to flush() manually, close() will do it automatically 

Nếu bạn không để lại nhận xét này, bảo trì trong tương lai có thể phải tra cứu javadoc quá, nếu như tôi rằng họ don' t có nó ghi nhớ. Nhưng sau đó, tại sao bạn sẽ viết bình luận như vậy khi nó dễ dàng hơn và tốt hơn để chỉ cần gọi nó là chính mình bây giờ và được thực hiện với nó.

Tóm lại, xả trước trước khi đóng chỉ đơn giản là theo logic tốt. Không cần giả định và dự đoán thứ hai, và không cần phải làm cho độc giả của bạn suy nghĩ.

+0

Hai điều nữa cần phải rõ ràng.1.Chỉ cần có dòng đệm mới được flush() trước khi đóng() 2.Mỗi luồng trong java. io sẽ không có bất kỳ tác dụng phụ nào nếu tôi đóng() mà không tuôn ra(). Đúng không? – Jaskey

+0

1. Có, xả nước là một khái niệm cụ thể cho đầu ra đệm. Xem thêm [Flushable] (https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html) 2. Có khá nhiều dòng trong 'java.io'. Tôi phải đi qua tất cả chúng để xác minh, và tôi chỉ không thấy điểm khi làm như vậy. Mặt khác, tôi đã thêm một lý do nữa để xóa, xem câu trả lời đã cập nhật của tôi. – janos

-1

Đối với đầu ra, điều quan trọng là chúng ta gọi flush() và close() vì dữ liệu đệm có thể bị mất, như được giải thích bởi câu trả lời đầu tiên here. Nếu đầu ra của chương trình của bạn nhỏ và nhà văn của bạn hoàn thành một cách nhanh chóng, nó sẽ không tạo ra nhiều khác biệt để đóng() và flush() trong kinh nghiệm của tôi.

Để nhập, sẽ không thành vấn đề nếu chúng tôi không gọi close() trước khi hệ thống thoát.

+0

Nhưng ' close() 'đã được tuôn ra cho chúng tôi, vì vậy đây là câu hỏi của tôi rằng tại sao chúng ta cần phải tuôn ra bằng tay ngay trước khi đóng() – Jaskey

+0

Tôi chưa bao giờ phải làm điều đó trước đây, không chắc chắn lý do tại sao bạn. –

+1

kiểm tra tại đây http://stackoverflow.com/questions/9858495/using-flush-before-close – Jaskey

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