9
votes

Réponse de la longueur du contenu de sortie?

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?


0 commentaires

3 Réponses :


2
votes

Vous pouvez envisager d'écrire à votre propre byearrayOutputStream et de le rincer au flux de sortie de réponse à la fin.


1 commentaires

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.



18
votes

Le moyen le plus simple est probablement de l'envelopper dans un autre OutputStream 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à.

EDIT: Juste deviner à un nom sensible ( CountingtingOutPutStream ) est venu avec une implémentation dans Apache Commons Io .

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 pourrait faire fonctionner la longueur de contenu ), vous avez peut-être des problèmes pour avoir besoin d'écrire la longueur avant é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.


5 commentaires

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 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.



9
votes

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:

  1. Écrivez les données sur un tableau d'octets [] à l'aide de BYTEOutPutStream, puis copiez cela dans le flux de sortie de réponse une fois que vous avez la taille des données. Cependant, si vous écrivez de gros fichiers, cela n'est évidemment pas une option.
  2. Écrivez les données dans un fichier temporaire, puis copiez cela à la sortie de réponse une fois la taille du fichier. Selon ce que vous faites, cela peut avoir une pénalité de performance inacceptable.
  3. En fonction de son coûteux de générer les données en premier lieu, vous pouvez le générer une fois et la jeter pour obtenir le compte, puis le générer à nouveau. Deviner que cela est peu probable d'être une solution réaliste.
  4. vous résignant au fait que vous ne serez pas en mesure de signaler la longueur du contenu dans l'en-tête de réponse.

0 commentaires