J'écris au flux de sortie à travers diverses méthodes. Comment puis-je, avant de le fermer, découvrez la longueur du contenu de la sortie? p>
3 Réponses :
Vous pouvez envisager d'écrire à votre propre byearrayOutputStream et de le rincer au flux de sortie de réponse à la fin. P>
Cela sera cependant très en mémoire de mec alors que chaque octet d'un octet [] mange un octet de la mémoire de JVM.
Le moyen le plus simple est probablement de l'envelopper dans un autre EDIT: Juste deviner à un nom sensible ( EDIT: Comme indiqué ailleurs, s'il s'agit pour HTTP et que votre client ne fait pas déjà ta mise en mémoire tampon des données complètes (auquel cas j'aurais pensé It em> pourrait faire fonctionner la longueur de contenu ), vous avez peut-être des problèmes pour avoir besoin d'écrire la longueur avant em> écrire les données. Dans certains cas, vous trouverez peut-être qu'il fonctionnera jusqu'à une certaine taille (que les tampons du client), puis échouent. Dans ce cas, les solutions de David seront appropriées. P> OutputStream code> qui transfère toutes les demandes d'écriture, mais conserve un compteur interne. Ensuite, vous écrivez à cela à la place. Ne devrait pas être trop difficile à mettre en œuvre - et en effet il peut y avoir un déjà. P>
CountingtingOutPutStream code>) est venu avec une implémentation dans Apache Commons Io . P>
U, Apache Commons! Je dois commencer à ne pas oublier Apache Commons !!! Je vais essayer.
Cela fonctionnerait-il sur de grandes données? Vous devez définir l'en-tête de "longueur de contenu" avant d'écrire quelque chose à la sortie de la réponse, tout comme David noté
@Andreyregentov: Cela dépend de ce que le contexte est. Si la sortie est mise en mémoire tampon par tout ce que vous écrivez, vous allez bien. Et nous ne nécessairement i> savons que c'est HTTP, bien que ce soit un pari raisonnable. Je vais modifier ma réponse avec quelques pensées.
@Jonskeet totalement d'accord sur le contexte. Je suis venu ici par Googling à propos de HTTP et supposait involontairement que la question concerne HTTP (réponse, longueur du contenu), bien qu'il n'y ait rien à ce sujet dans la question.
@Andreyregentov: Cela semble très probable cependant :) Quoi qu'il en soit, j'ai ajouté un peu la réponse de David.
Le problème est que vous devez définir la longueur du contenu dans l'en-tête de réponse avant de commencer à écrire toutes les données dans le flux de sortie. Donc, vos options sont: p>