6

Tworzę dokumenty PDF w pamięci jako OutputStream s. Te powinny zostać przesłane do S3. Mój problem polega na tym, że nie można bezpośrednio utworzyć PutObjectRequest (zgodnie z this thread in the AWS dev forum). Używam aws-java-sdk-s3 v1.10.8 w aplikacji Dropwizard.Jak przesłać Java OutputStream do AWS S3

Dwa obejścia widzę do tej pory to:

  1. Skopiuj OutputStream do InputStream i zaakceptować fakt, że dwukrotnie ilość pamięci RAM jest używany.
  2. Rura OutputStream do InputStream i przyjmuję napowietrznej dodatkowym gwintem (patrz this answer)

Jeśli nie znajdę lepszego rozwiązania Pójdę z nr 1, bo to wygląda tak, jakbym mógł sobie pozwolić na dodatkową pamięć łatwiej niż wątki/CPU w mojej konfiguracji.

Czy istnieje jakikolwiek inny, być może skuteczniejszy sposób na osiągnięcie tego, co do tej pory przeoczyłem?

EDIT: Moi OutputStream s są ByteArrayOutputStream s

+0

"Tworzę dokumenty PDF w pamięci jako OutputStreams" - ?? 'OutputStream' nie przechowuje danych (prawdopodobnie z wyjątkiem' ByteArrayOutputStream', ale wtedy powiedziałbyś, że utworzyłeś go w pamięci jako * tablica bajtów *) – immibis

+0

Używam ByteArrayOutputStream. Przepraszam za zamieszanie. – EagleBeak

+0

Mam podobne pytanie - http://stackoverflow.com/questions/40268320/how-to-store-object-on-s3-using-outputstream. Czy byłeś w stanie znaleźć rozwiązanie tego problemu? Jeśli nie, to w jaki sposób zrobiłeś w swojej sprawie nr 1? – Omnipresent

Odpowiedz

2

Rozwiązałem to przez instacji 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

Należy to zmienić na 'return new ByteArrayInputStream (buf, 0, count);' inaczej nieprzydzielone dane w 'buf' mogą być uznane za rzeczywiste dane w InputStream. –

1

Jaki jest rzeczywisty typ swojej OutputStream? Ponieważ jest to klasa abstrakcyjna, nie ma żadnego stwierdzenia, gdzie dane faktycznie się udają (lub nawet gdziekolwiek jeżdżą).

Ale załóżmy, że mówimy o ByteArrayOutputStream, ponieważ przynajmniej zachowuje dane w pamięci (w przeciwieństwie do wielu innych).

Jeśli utworzysz ByteArrayInputStream ze swojego bufora, nie ma duplikowanej pamięci. To jest cała idea streamingu.

+1

OK, a jak zasugerowałbym, że powinienem uzyskać dostęp do bufora? Czy poleciłbyś stworzenie podklasy i dostarczenie publicznego gettera dla chronionego pola 'buf' z' ByteArrayOutputStream'? – EagleBeak

+0

Eh, nie zdawałem sobie sprawy, że BAOS tworzy kopię bufora z 'toByteArray'. Tak, powinieneś pójść na ścieżkę podklasy. – Kayaman

+0

Dokładnie, stąd pomysł na podklasę. – EagleBeak

Powiązane problemy