6

Tôi tạo tài liệu PDF trong bộ nhớ dưới dạng OutputStream s. Chúng sẽ được tải lên S3. Vấn đề của tôi là bạn không thể tạo trực tiếp số PutObjectRequest từ số OutputStream (theo số this thread in the AWS dev forum). Tôi sử dụng aws-java-sdk-s3 v1.10.8 trong ứng dụng Dropwizard.Làm thế nào để tải lên một Java OutputStream đến AWS S3

Hai cách giải quyết tôi có thể thấy cho đến nay là:

  1. Sao chép OutputStream một InputStream và chấp nhận rằng hai lần dung lượng RAM được sử dụng.
  2. ống các OutputStream một InputStream và chấp nhận các nguyên cần thiết của một chủ đề phụ (xem this answer)

Nếu tôi không tìm thấy một giải pháp tốt hơn, tôi sẽ đi với # 1, vì nó trông như thể tôi có thể đủ khả năng bộ nhớ thêm dễ dàng hơn so với chủ đề/CPU trong thiết lập của tôi.

Có cách nào khác, có thể hiệu quả hơn để đạt được điều này mà tôi đã bỏ qua cho đến nay không?

Edit: My OutputStream s là ByteArrayOutputStream s

+0

"Tôi tạo tài liệu PDF trong bộ nhớ như OutputStreams" - ?? một 'OutputStream' không lưu trữ dữ liệu (có thể ngoại trừ' ByteArrayOutputStream', nhưng sau đó bạn muốn nói rằng bạn đã tạo nó trong bộ nhớ như là một mảng * byte *) – immibis

+0

Tôi sử dụng ByteArrayOutputStream. Xin lỗi vì sự nhầm lẫn. – EagleBeak

+0

Tôi có một câu hỏi tương tự - http://stackoverflow.com/questions/40268320/how-to-store-object-on-s3-using-outputstream. Bạn có thể tìm ra giải pháp cho việc này không? Nếu không, làm thế nào bạn đi về làm # 1 trong trường hợp của bạn? – Omnipresent

Trả lời

2

tôi giải quyết điều này bằng cách subclassing 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

Điều này cần được thay đổi thành 'trả về ByteArrayInputStream mới (buf, 0, count);', nếu không dữ liệu chưa được phân bổ trong 'buf' có thể được coi là dữ liệu thực tế trong InputStream. –

1

loại thực tế của OutputStream của bạn là gì? Vì nó là một lớp trừu tượng, không có gì nói dữ liệu thực sự đi (hoặc nếu nó thậm chí đi bất cứ đâu).

Nhưng giả sử bạn đang nói về một số ByteArrayOutputStream vì ít nhất nó cũng giữ dữ liệu trong bộ nhớ (không giống như nhiều dữ liệu khác).

Nếu bạn tạo ByteArrayInputStream khỏi bộ đệm, không có bộ nhớ trùng lặp. Đó là toàn bộ ý tưởng phát trực tuyến.

+1

OK, và bạn đề nghị tôi nên truy cập bộ đệm như thế nào? Bạn có đề nghị tạo một lớp con và cung cấp một trình thu thập công khai cho trường được bảo vệ 'buf' từ' ByteArrayOutputStream' không? – EagleBeak

+0

Eh, tôi đã không nhận ra rằng BAOS tạo một bản sao của bộ đệm với 'toByteArray'. Vâng, bạn nên đi cho tuyến đường con. – Kayaman

+0

Chính xác, do đó, ý tưởng phân lớp. – EagleBeak

Các vấn đề liên quan