web-dev-qa-db-fra.com

Dois-je vider le flux de sortie de la servlet?

Dois-je "vider" le OutputStream de HttpServletResponse?

J'ai déjà vu de à Dois-je fermer le flux de sortie de la servlet? que je n'ai pas besoin de le fermer, mais ce n'est pas clair si j'ai besoin de le vider. Dois-je m'attendre aussi de la part du conteneur?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException {
   byte[] response = getResponse();
   String responseType = getResponseType();

   response.setContentLength(response.length);
   response.setContentType(responseType);
   response.getOutputStream().write(response);
   response.getOutputStream().flush(); // yes/no/why?
}
28
Carlos Aguayo

Tu n'as pas besoin. Le servletcontainer le rincera et le fermera pour vous. La fin en passant appelle déjà implicitement flush.

Voir aussi le chapitre 5.6 de Spécification Servlet 3.1 :

5.6 Objet de fermeture

Lorsqu'une réponse est fermée, le conteneur doit immédiatement vider tout le contenu Restant dans la mémoire tampon de réponse au client. Les événements suivants indiquent que le servlet a satisfait la demande et que l'objet de réponse doit être fermé:

  • L'arrêt de la méthode service de la servlet.
  • La quantité de contenu spécifiée dans la méthode setContentLength ou setContentLengthLong de la réponse a été supérieure à zéro et A été écrite dans la réponse.
  • La méthode sendError est appelée.
  • La méthode sendRedirect est appelée.
  • La méthode complete sur AsyncContext est appelée.

Appeler un flush tout en exécutant le service du servlet n'est généralement avantageux que si vous avez plusieurs enregistreurs sur le même flux et que vous souhaitez changer d'écrivain (par exemple, un fichier contenant des données mixtes binaires/caractères), ou lorsque vous souhaitez garder le pointeur de flux ouvert. pour un temps incertain (par exemple, un fichier journal).

46
BalusC

Suppose que la même réponse que dans ton autre question s’applique ici: si c’est ton flux, claque-le et ferme-le. Sinon, le créateur du flux devrait le faire, sauf indication contraire.

3
mdrg

Pour signaler une exception insidieuse à la règle «inutile de vider»: Travailler avec IBM WebSphere Application Server et utiliser la réponse Writer (plutôt que OutputStream ), j'ai constaté que je devais le vider. sinon, une dernière partie de mes données de réponse a été perdue. Je suppose que la classe HttpServletResponse d'IBM vide effectivement le OutputStream mais utilise un tampon séparé pour le Writer et ne le vide pas. D'autres serveurs d'applications semblent le faire.

Donc, si vous envoyez vos données de réponse au Writer , il est plus prudent de les effacer. Mais il n’est pas nécessaire de vider le OutputStream dans le marché.

(J'aurais posté cela comme un commentaire, mais la réputation me manque pour le faire.)

1
Renardo