2009-09-15 24 views
11

Tôi đang phát dữ liệu nhị phân (tệp CSV được trích xuất từ ​​cơ sở dữ liệu dưới dạng Clob) đến trình duyệt bằng cách gọi response.getOutputStream() và thường bao bọc OutputStream trong BufferedOutputStream khi sao chép dữ liệu.Việc đóng một BufferedOutputStream cũng đóng OutputStream bên dưới?

Tôi có nên đóng BufferedOutputStream hoặc điều này cũng sẽ đóng OutputStream bên dưới không?

[thêm câu hỏi:? Tôi có cần phải sử dụng một BufferedOutputStream trong trường hợp này hoặc là phản ứng đã đệm]

Trả lời

12

Vâng, nó đóng cửa nó. Đối với việc bạn nên đóng nó - bạn có dự định viết bất kỳ thứ gì khác cho luồng phản hồi không? Nếu không, tôi nghĩ sẽ ổn thôi. Nếu bạn không đóng nó, bạn nên rõ ràng tuôn ra nó để thay thế - nhưng tôi nghi ngờ bạn có thể tìm ra rằng bit ra cho chính mình :)

Hành vi này thực sự được thừa kế từ FilterOutputStream. Javadocs cho cho FilterOutputStream.close nhà nước:

Phương pháp chặt chẽ của FilterOutputStream gọi phương thức tuôn ra của nó, và sau đó gọi phương pháp chặt chẽ của dòng đầu ra cơ bản của nó.

Để biết liệu bạn có nên lưu bộ đệm không - tôi không chắc rằng điều này được xác định rõ. Nó có thể được chôn trong thông số servlet ở đâu đó - và thậm chí nó có thể cấu hình được (đôi khi bạn thực sự không muốn đệm, nhưng nếu bạn có thể đệm toàn bộ phản hồi thì có nghĩa là bạn có thể phục vụ một trang lỗi đẹp hơn nếu mọi thứ xảy ra sau khi bạn ' đã bắt đầu viết).

4

Đóng BufferedOutputStream cũng sẽ đóng OutputStream bên dưới. Bạn nên đóng BufferedOutputStream để nó tuôn ra nội dung của nó trước khi đóng luồng bên dưới. Xem việc thực hiện FilterOutputStream.close() (từ đó BufferedOutputStream mở rộng) để thuyết phục bản thân bạn.

Tôi đoán có hay không luồng phản hồi được cung cấp cho servlet của bạn được đệm hay không phụ thuộc vào việc triển khai Vùng chứa Servlet của bạn. FWIW Tôi biết rằng Tomcat sẽ đệm các dòng đáp ứng servlet của nó theo mặc định, để cố gắng thiết lập tiêu đề HTTP có độ dài nội dung.

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