Antwort der Ausgabestream-Inhaltslänge?

8

Ich schreibe über verschiedene Methoden in den Ausgabestream. Wie kann ich, bevor ich es schließe, die Inhaltslänge des Ausgabestroms herausfinden?

    
Trick 18.11.2009, 14:34
quelle

3 Antworten

16

Der einfachste Weg besteht wahrscheinlich darin, ihn in eine andere OutputStream -Implementierung einzufügen, die alle Schreibanforderungen weiterleitet, aber einen internen Zähler beibehält. Dann schreibst du stattdessen einfach dazu. Sollte nicht zu schwer zu implementieren sein - und in der Tat könnte es schon einen geben.

BEARBEITEN: Bei einem vernünftigen Namen ( CountingOutputStream ) wurde eine Implementierung in Apache Commons IO .

BEARBEITEN: Wie bereits an anderer Stelle erwähnt, wenn dies für HTTP ist und Ihr Client nicht bereits die vollständigen Daten puffert (in diesem Fall hätte ich gedacht, dass es die Inhaltslänge berechnen könnte) ), haben Sie möglicherweise Probleme, weil Sie die Länge schreiben müssen, bevor die Daten geschrieben werden. 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.

    
Jon Skeet 18.11.2009, 14:37
quelle
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:

  1. Schreiben Sie die Daten mit ByteOutputStream in ein byte [] -Array und kopieren Sie das 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.
  2. Schreiben Sie die Daten in eine temporäre Datei und kopieren Sie diese dann in die Antwortausgabe, sobald Sie die Dateigröße erreicht haben. Je nachdem, was Sie gerade tun, kann dies zu einer Leistungseinbuße führen, die nicht akzeptabel ist.
  3. Abhängig davon, 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.
  4. Weisen Sie sich der Tatsache zu, dass Sie die Inhaltslänge nicht im Antwortheader melden können.
David 18.11.2009 15:26
quelle
2

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

    
Dmitry 18.11.2009 14:36
quelle

Tags und Links