Ich schreibe auf Ausgabestrom über verschiedene Methoden. Wie kann ich, bevor ich es schließe, die Inhaltslänge des Ausgabestroms herausfinden?Antwort Ausgangsstrom-Inhaltslänge?
Antwort
Der einfachste Weg ist wahrscheinlich, es in eine andere OutputStream
Implementierung zu wickeln, die auf alle Schreibanforderungen weiterleitet, aber einen internen Zähler führt. Dann schreibst du stattdessen einfach dazu. Sollte nicht zu schwer zu implementieren sein - und vielleicht gibt es auch schon einen.
EDIT: Erraten nur bei einem vernünftigen Namen (CountingOutputStream
) kam mit einer Implementierung in Apache Commons IO.
EDIT: Wie an anderer Stelle erwähnt, wenn dies für HTTP ist und Ihr Client ist nicht bereits Pufferung der vollständigen Daten (in diesem Fall hätte ich gedacht könnte die Inhaltslänge erarbeiten), können Sie Probleme haben, weil die Länge vor geschrieben werden muss, um die Daten zu schreiben. In einigen Fällen können Sie feststellen, dass es bis zu einer bestimmten Größe funktioniert (die der Client puffert) und dann fehlschlägt. In diesem Fall werden Davids Lösungen angemessen sein.
Sie können in Erwägung ziehen, in Ihren eigenen ByteArrayOutputStream zu schreiben und ihn am Ende des Antwort-Ausgabestreams zu bündeln.
Das wird jedoch sehr Speicherhunger sein, da jedes Byte eines Bytes [] ein Byte des JVM-Speichers frisst. – BalusC
Das Problem besteht darin, dass Sie die Inhaltslänge im Antwortheader festlegen müssen, bevor Sie mit dem Schreiben von Daten in den Ausgabestream beginnen. Ihre Optionen sind also:
U, Apache Commons! Ich muss anfangen Apache Commons nicht zu vergessen !!! Ich werde es versuchen. – Trick
Es funktioniert :) – Trick
Würde es bei großen Daten funktionieren? Sie sollten den Header "Content-length" setzen, bevor Sie irgendwas in den outputStream der Antwort schreiben, so wie David notierte –