2011-01-20 28 views
9

Tại sao trên một thể hiện của ServletResponse cả getWriter()getOutputStream() không thể gọi?Servlets trong java - cả getWriter() và getOutputStream()

+0

Nó có thể giúp bạn giải thích tại sao bạn muốn gọi cả hai trong một yêu cầu servlet. –

+0

Có lẽ không phải là Abkutty muốn gọi cả hai, nhưng Servlet, lỗi xử lý Servlet và một số Bộ lọc tất cả cố gắng ghi đầu ra, và không phối hợp đúng cách với nhau để sử dụng phương thức nào. – Thilo

+0

Tôi sẽ nghĩ lại về lý do tại sao bạn muốn có cả hai. –

Trả lời

18

Quyết định thiết kế. Writer và OutputStream đều duy trì bộ đệm riêng của họ. Nếu bạn đã tạo ra một cái thì đầu ra của chúng sẽ cần được hợp nhất bằng cách nào đó. Có thể, nhưng phức tạp hơn. Vì vậy, họ quyết định rằng bạn phải chọn nếu bạn muốn đầu ra dựa trên ký tự hoặc đầu ra nhị phân.

+0

Vậy tại sao getWriter() trả về một wrapper trên kết quả getOutputStream()? –

+0

Vì nếu bạn cố gắng viết thư cho cả hai, bạn sẽ làm hỏng kết quả do bộ đệm không được phối hợp. Hay bạn hỏi tại sao Writer không trưng ra các phương thức đầu ra nhị phân của OutputStream? – Thilo

4

Nói chung điều này là do getOutputStream() được sử dụng để viết nội dung nhị phân, trong khi getWriter() được sử dụng để viết nội dung văn bản. Nó sẽ không có ý nghĩa để viết cả hai trong một yêu cầu servlet - bạn nên sử dụng một hoặc khác.

12

Bởi vì Writer là mức trừu tượng cao hơn so với OutputStream. Nó kiểm soát mã hóa ký tự của luồng cơ bản và kết hợp các cơ chế đệm riêng của nó.

Nếu bạn đang viết trực tiếp vào OutputStream sau khi sử dụng Writer trước đó, sẽ có nguy cơ bị hỏng luồng cơ bản, do mã hóa ký tự hỗn hợp hoặc thiếu dữ liệu đệm.

Để ngăn chặn sự hỗn hợp này, API servlet cấm sử dụng cả hai cho bất kỳ phản hồi nào.

Thực tế hơn, bạn sử dụng OutputStream để viết nội dung nhị phân và Writer để viết nội dung văn bản.

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