2011-01-20 11 views
9

Perché su un'istanza di ServletResponse non è possibile chiamare sia getWriter() e getOutputStream()?Servlet in java - getWriter() e getOutputStream()

+0

Potrebbe essere utile se si dovesse spiegare perché si desidera chiamare entrambi in una richiesta di servlet. –

+0

Probabilmente non è Abkutty che vuole chiamare entrambi, ma il servlet, il servlet di gestione degli errori e alcuni filtri che tentano tutti di scrivere output e non coordinano correttamente tra loro quale metodo utilizzare. – Thilo

+0

Vorrei ripensare al motivo per cui vuoi avere entrambi. –

risposta

18

Una decisione di progettazione. Sia Writer che OutputStream mantengono il proprio buffer. Se ne hai creato uno, allora il loro output dovrebbe essere unito in qualche modo. Possibile, ma più complicato. Quindi hanno deciso di scegliere se si desidera un output basato su caratteri o un output binario.

+0

Quindi perché getWriter() non restituisce un wrapper sul risultato di getOutputStream()? –

+0

Perché se provassi a scrivere su entrambi, rovinerai il risultato a causa del buffering non coordinato. O stai chiedendo perché Writer non espone i metodi di output binario di OutputStream? – Thilo

4

Generalmente questo è dovuto al fatto che getOutputStream() viene utilizzato per scrivere contenuti binari, mentre getWriter() viene utilizzato per scrivere contenuto testuale. Non avrebbe senso scrivere entrambi in una richiesta di servlet: dovresti usare l'una o l'altra.

12

Perché uno Writer è un'astrazione di livello superiore rispetto a OutputStream. Controlla la codifica dei caratteri del flusso sottostante e incorpora i propri meccanismi di buffering.

Se si dovesse scrivere direttamente su OutputStream dopo aver utilizzato in precedenza il writer, si correrebbe il rischio elevato di danneggiamento del flusso sottostante, a causa della codifica di caratteri con collegamento misto o della mancanza di dati memorizzati nel buffer.

Per evitare questo confusione, l'API servlet impedisce l'utilizzo di entrambi per una sola risposta.

Più praticamente, si utilizza OutputStream per scrivere contenuti binari e Writer per scrivere contenuto testuale.

Problemi correlati