Je suis en train d'écrire pour les flux de sortie par le biais de diverses méthodes. Comment puis-je, avant de me la fermer, à savoir la longueur du contenu de l'outputstream?
La façon la plus simple est probablement de l'envelopper dans un autre OutputStream de mise en œuvre qui les transmet à toutes les demandes d'écriture, mais maintient un compteur interne. Ensuite, il vous suffit d'écrire à la place. Ne devrait pas être trop dur à mettre en place - et en effet il y a peut-être déjà un.
EDIT: Juste deviner à un nom judicieux (CountingOutputStream) est venu avec une mise en œuvre dans Apache Commons IO.
EDIT: Comme l'a noté ailleurs, si c'est pour HTTP et votre client n'est pas déjà en train de le mettre en mémoire tampon de l'ensemble des données (dans ce cas, j'aurais pensé il pourrait travailler sur le contenu de la longueur), vous pouvez avoir des problèmes à cause de besoin d'écrire la longueur avant l'écriture des données. Dans certains cas, vous pouvez trouver qu'il va travailler jusqu'à une certaine taille (dont le client tampons) et puis d'échouer. Dans ce cas, David solutions appropriées.
U, Apache Commons! J'ai commencer à ne pas oublier à propos de Apache Commons!!! Je vais essayer. Il travaille 🙂 Serait-il travailler sur des données de grande taille? Vous devriez mettre "Content-length" tête avant d'écrire quelque chose à la réponse de l'outputStream, tout comme David Cela dépend de ce que le contexte est. Si la sortie a été tamponnée par tout ce que vous avez écrit, vous êtes fine. Et nous n'avons pas forcément sais que c'est HTTP, même si c'est un pari raisonnable. Je vais modifier ma réponse avec quelques pensées. tout à fait d'accord sur le contexte. Je suis venu ici par googler sur HTTP et involontairement suppose que la question est sur HTTP (réponse, le contenu de la longueur), mais il n'y a rien à ce sujet dans la question.
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 des données sur le flux de sortie. Afin que vos options sont les suivantes:
Écrire les données sur un byte[] tableau à l'aide de ByteOutputStream et puis le copier dans la réponse au flux de sortie une fois que vous avez la taille des données. Toutefois, si vous êtes à l'écriture de gros fichiers, ce n'est évidemment pas une option.
Écrire les données dans un fichier temporaire, puis copiez qu'à la sortie de la réponse une fois que vous obtenez la taille du fichier. En fonction de ce que vous faites, cela peut avoir sur les performances que c'est inacceptable.
En fonction de la façon dont elle est chère pour générer les données en premier lieu, vous pourriez produire une fois, et de le jeter pour obtenir le nombre et ensuite de générer de nouveau. Devinant que cela est peu être une solution réaliste.
Résigner au fait que vous ne serez pas en mesure de rapport de la longueur du contenu dans l'en-tête de réponse.
La façon la plus simple est probablement de l'envelopper dans un autre
OutputStream
de mise en œuvre qui les transmet à toutes les demandes d'écriture, mais maintient un compteur interne. Ensuite, il vous suffit d'écrire à la place. Ne devrait pas être trop dur à mettre en place - et en effet il y a peut-être déjà un.EDIT: Juste deviner à un nom judicieux (
CountingOutputStream
) est venu avec une mise en œuvre dans Apache Commons IO.EDIT: Comme l'a noté ailleurs, si c'est pour HTTP et votre client n'est pas déjà en train de le mettre en mémoire tampon de l'ensemble des données (dans ce cas, j'aurais pensé il pourrait travailler sur le contenu de la longueur), vous pouvez avoir des problèmes à cause de besoin d'écrire la longueur avant l'écriture des données. Dans certains cas, vous pouvez trouver qu'il va travailler jusqu'à une certaine taille (dont le client tampons) et puis d'échouer. Dans ce cas, David solutions appropriées.
Il travaille 🙂
Serait-il travailler sur des données de grande taille? Vous devriez mettre "Content-length" tête avant d'écrire quelque chose à la réponse de l'outputStream, tout comme David
Cela dépend de ce que le contexte est. Si la sortie a été tamponnée par tout ce que vous avez écrit, vous êtes fine. Et nous n'avons pas forcément sais que c'est HTTP, même si c'est un pari raisonnable. Je vais modifier ma réponse avec quelques pensées.
tout à fait d'accord sur le contexte. Je suis venu ici par googler sur HTTP et involontairement suppose que la question est sur HTTP (réponse, le contenu de la longueur), mais il n'y a rien à ce sujet dans la question.
OriginalL'auteur Jon Skeet
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 des données sur le flux de sortie. Afin que vos options sont les suivantes:
OriginalL'auteur David
Vous pouvez écrire à votre propre ByteArrayOutputStream et de la chasse pour la réponse au flux de sortie à la fin.
OriginalL'auteur Dmitry