6

Ich erstelle PDF-Dokumente im Speicher als OutputStream s. Diese sollten in S3 hochgeladen werden. Mein Problem ist, dass es nicht möglich ist, einen PutObjectRequest von einem OutputStream direkt zu erstellen (nach this thread in the AWS dev forum). Ich benutze aws-java-sdk-s3 v1.10.8 in einer Dropwizard App.So laden Sie einen Java OutputStream nach AWS S3

Die beiden Abhilfen ich bisher sehen können, sind:

  1. Kopieren Sie die OutputStream zu einem InputStream und akzeptieren, dass die doppelte Menge an RAM verwendet wird.
  2. Rohr die OutputStream zu einem InputStream und den Aufwand eines zusätzlichen Fadens akzeptieren (siehe this answer)

Wenn ich mich mit # 1, gehe nicht um eine bessere Lösung finden, weil es, als ob ich aussieht könnte mir den zusätzlichen Speicher leichter leisten als Threads/CPU in meinem Setup.

Gibt es andere, möglicherweise effizientere Möglichkeiten, dies zu erreichen, die ich bisher übersehen habe?

Edit: Meine OutputStream s sind ByteArrayOutputStream s

+0

"Ich PDF-Dokumente im Speicher als OutputStreams erstellen" - ?? Ein 'OutputStream' speichert keine Daten (möglicherweise außer' ByteArrayOutputStream', aber dann würden Sie sagen, dass Sie es im Speicher als * Byte-Array * erstellt haben) – immibis

+0

Ich benutze ByteArrayOutputStream. Entschuldigung für die Verwirrung. – EagleBeak

+0

Ich habe eine ähnliche Frage - http://stackoverflow.com/questions/40268320/how-to-store-object-on-s3-using-outputstream. Konnten Sie dafür eine Lösung finden? Wenn nicht, wie sind Sie in Ihrem Fall zu # 1 gegangen? – Omnipresent

Antwort

2

Ich löste dies durch ConvertibleOutputStream Subklassen:

public class ConvertibleOutputStream extends ByteArrayOutputStream { 
    //Craetes InputStream without actually copying the buffer and using up mem for that. 
    public InputStream toInputStream(){ 
     return new ByteArrayInputStream(buf, 0, count); 
    } 
} 
+0

Dies muss geändert werden in 'return new ByteArrayInputStream (buf, 0, count);', andernfalls können nicht zugeordnete Daten in 'buf' als tatsächliche Daten im InputStream betrachtet werden. –

1

Was ist die eigentliche Art Ihrer OutputStream? Da es sich um eine abstrakte Klasse handelt, wird nicht gesagt, wohin die Daten tatsächlich gehen (oder ob sie überhaupt irgendwo hingehört).

Aber nehmen wir an, dass Sie über eine ByteArrayOutputStream sprechen, da es zumindest die Daten im Speicher hält (im Gegensatz zu vielen anderen).

Wenn Sie einen ByteArrayInputStream aus seinem Puffer erstellen, gibt es keinen doppelten Speicher. Das ist die ganze Idee des Streaming.

+1

OK, und wie würden Sie vorschlagen, ich sollte auf den Puffer zugreifen? Würden Sie empfehlen, eine Unterklasse zu erstellen und einen öffentlichen Getter für das geschützte Feld 'buf' aus dem' ByteArrayOutputStream' bereitzustellen? – EagleBeak

+0

Eh, ich habe nicht bemerkt, dass BAOS eine Kopie des Puffers mit 'toByteArray' erstellt. Ja, du solltest für die Unterklassenroute gehen. – Kayaman

+0

Genau, daher die Idee der Unterklasse. – EagleBeak