如何将 Java OutputStream 上传到 AWS S3

我在内存中创建PDF文档作为s。这些应上传到 S3。我的问题是,不可能直接从 创建一个(根据AWS开发论坛中的这个线程)。我在Dropwizard应用程序中使用v1.10.8。OutputStreamPutObjectRequestOutputStreamaws-java-sdk-s3

到目前为止,我可以看到的两种解决方法是:

  1. 将 复制到 ,并接受使用两倍的 RAM 量。OutputStreamInputStream
  2. 将 管道连接到 和 接受额外线程的开销(请参阅此答案OutputStreamInputStream)

如果我没有找到更好的解决方案,我会选择#1,因为看起来我可以在设置中比线程/ CPU更容易地提供额外的内存。

到目前为止,有没有其他可能更有效的方法来实现这一目标, 我忽略了这一点?

编辑:我的 s 是 sOutputStreamByteArrayOutputStream


答案 1

我通过子类化解决了这个问题: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);
    }
}

答案 2

您的实际类型是什么?由于它是一个抽象类,因此没有说明数据的实际去向(或者它是否去任何地方)。OutputStream

但是,让我们假设您正在谈论一个,因为它至少将数据保存在内存中(与许多其他数据不同)。ByteArrayOutputStream

如果在其缓冲区外创建一个,则不会有重复的内存。这就是流媒体的整个想法。ByteArrayInputStream


推荐