【问题标题】:How to create a java OutputStream for an S3 object and write value to it?如何为 S3 对象创建 java OutputStream 并向其写入值?
【发布时间】:2020-05-29 10:48:41
【问题描述】:

使用 AmazonS3 类中的方法将内容添加到 S3 文件的现有方法是

  • 通过带有 InputStream 的 putObject
  • 创建包含内容的本地文件并将其上传到 S3。

有没有一种方法可以为现有的 S3 对象创建一个可以写入列表中的值的 OutputStream?我发现没有 API 可以这样做。

【问题讨论】:

  • OutputStream 用于从源读取数据,InputStream 用于将数据写入目标。你试图做的事情没有意义。使用 InputStream。
  • @Trinopot OutputStream 具有 write 方法,这就是您在使用 System.out.println() docs.oracle.com/en/java/javase/13/docs/api/java.base/java/io/… 时(间接)使用的方法
  • 哦,是的。猜猜我把它倒过来了。

标签: java amazon-web-services performance amazon-s3 outputstream


【解决方案1】:

可以创建一个包装 AmazonS3 客户端的 S3OutputStream。有关实施,请参阅此要点: https://gist.github.com/blagerweij/ad1dbb7ee2fff8bcffd372815ad310eb 它会自动检测大文件,并在需要时使用多部分传输。它使用字节数组进行缓冲,该缓冲区的大小取决于您的用例。 (默认为 10MB)

例如:

   final S3Client s3Client = AmazonS3ClientBuilder.defaultClient();
   final OutputStream out = new S3OutputStream(s3Client, "bucket", "path/file.ext");

【讨论】:

    【解决方案2】:

    你可以看看 AWS SDK Performing Operations on an Amazon S3 Object

    ...
    S3Client s3;
    ...
    // Put Object
    s3.putObject(bucket,object);
    

    【讨论】:

    • 这里的问题是,我试图放在这里的对象可能要大得多,可能是 gbs 大小。在这种情况下,堆内存可能会受到影响。
    • “上传多个部分的对象”部分在这种情况下没有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2018-04-18
    • 1970-01-01
    • 2018-05-12
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多