6

Creo documenti PDF in memoria come OutputStream s. Questi dovrebbero essere caricati su S3. Il mio problema è che non è possibile creare uno PutObjectRequest da un OutputStream direttamente (secondo this thread in the AWS dev forum). Io uso aws-java-sdk-s3 v1.10.8 in un'app Dropwizard.Come caricare un OutputStream Java in AWS S3

Le due soluzioni posso vedere finora sono:

  1. Copiare il OutputStream a un InputStream e accettano che il doppio della quantità di RAM viene utilizzato.
  2. tubo del OutputStream a un InputStream ed accettare il sovraccarico di un thread aggiuntivo (vedi this answer)

Se non trovo una soluzione migliore Vengo con 1 #, perché sembra come se io potrebbe permettermi la memoria extra più facilmente di thread/CPU nella mia configurazione.

C'è qualche altro, forse un modo più efficace per raggiungere questo che ho trascurato finora?

Modifica: mie OutputStream s sono ByteArrayOutputStream s

+0

"Ho creare documenti PDF in memoria come OutputStreams" - ?? un 'OutputStream' non memorizza i dati (possibilmente ad eccezione di' ByteArrayOutputStream', ma poi si direbbe che è stato creato in memoria come * array di byte *) – immibis

+0

Uso ByteArrayOutputStream. Dispiace per la confusione. – EagleBeak

+0

Ho una domanda simile - http://stackoverflow.com/questions/40268320/how-to-store-object-on-s3-using-outputstream. Sei riuscito a trovare una soluzione per questo? Se no, come hai fatto a fare il numero 1 nel tuo caso? – Omnipresent

risposta

2

ho risolto questo sottoclasse ConvertibleOutputStream:

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

Questo deve essere modificato in 'return new ByteArrayInputStream (buf, 0, count);', altrimenti i dati non allocati in 'buf' possono essere considerati dati effettivi in ​​InputStream. –

1

Qual è il tipo effettivo del vostro OutputStream? Dato che è una classe astratta, non si può dire dove i dati vadano effettivamente (o se vadano anche da qualche parte).

Ma supponiamo che tu stia parlando di uno ByteArrayOutputStream poiché conserva almeno i dati in memoria (a differenza di molti altri).

Se si crea un ByteArrayInputStream dal suo buffer, non c'è memoria duplicata. Questa è l'idea di streaming.

+1

OK, e come suggeriresti che dovrei accedere al buffer? Consiglieresti di creare una sottoclasse e fornire un getter pubblico per il campo protetto 'buf' da' ByteArrayOutputStream'? – EagleBeak

+0

Eh, non mi ero reso conto che BAOS crea una copia del buffer con 'toByteArray'. Sì, dovresti seguire la rotta della sottoclasse. – Kayaman

+0

Esattamente, quindi l'idea della sottoclasse. – EagleBeak