2009-11-18 4 views

Antwort

16

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.

+0

U, Apache Commons! Ich muss anfangen Apache Commons nicht zu vergessen !!! Ich werde es versuchen. – Trick

+0

Es funktioniert :) – Trick

+0

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 –

2

Sie können in Erwägung ziehen, in Ihren eigenen ByteArrayOutputStream zu schreiben und ihn am Ende des Antwort-Ausgabestreams zu bündeln.

+5

Das wird jedoch sehr Speicherhunger sein, da jedes Byte eines Bytes [] ein Byte des JVM-Speichers frisst. – BalusC

8

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:

  • Schreiben Sie die Daten mit ByteOutputStream in ein byte [] -Array und kopieren Sie diese dann in den Antwortausgabe-Stream, sobald Sie die Größe der Daten haben. Wenn Sie jedoch große Dateien schreiben, ist dies offensichtlich keine Option.
  • Schreiben Sie die Daten in eine temporäre Datei und kopieren Sie diese dann in die Antwortausgabe, sobald Sie die Dateigröße erhalten haben. Je nachdem, was Sie tun, kann dies zu einer Leistungseinbuße führen, die nicht akzeptabel ist.
  • Je nachdem, wie teuer es ist, die Daten an erster Stelle zu generieren, können Sie sie einmal generieren und wegwerfen, um die Anzahl zu ermitteln und sie dann erneut zu generieren. Ich nehme an, dass dies wahrscheinlich keine realistische Lösung ist.
  • Weisen Sie sich darauf zurück, dass Sie die Inhaltslänge im Antwortheader nicht melden können.
  • Verwandte Themen