You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量上传Java对象列表至Amazon S3?

批量序列化后单次上传至Amazon S3

你当前的实现每次序列化一个对象就发起一次S3上传,多次HTTP请求会严重拖低效率。解决思路是先将所有有效对象序列化到同一个输出流,最后仅执行一次上传操作,具体修改如下:

调整序列化方法

把原来单个对象创建独立流的逻辑,改成直接将序列化内容写入共用的输出流,减少不必要的对象创建:

private boolean serialize(final Object object, OutputStream outputStream) {
    try {
        Json.writeValueAsToOutputStream(object, outputStream);
        outputStream.write('\n');
        return true;
    } catch (final Exception e) {
        log.error("Error serializing data {}", object, e);
        return false;
    }
}

批量处理与单次上传

遍历所有对象,将有效序列化内容写入总输出流,最后一次性上传到S3:

// 初始化总输出流,设置合理初始容量减少扩容开销
ByteBufferOutputStream totalOutputStream = new ByteBufferOutputStream(1024 * 1024, true, false);
try {
    for (Data event : events) {
        // 逐个序列化到总流,跳过失败的对象
        boolean serializeSuccess = serialize(event, totalOutputStream);
        if (!serializeSuccess) {
            continue;
        }
    }

    // 避免上传空文件
    if (totalOutputStream.size() > 0) {
        PutObjectRequest objectRequest = PutObjectRequest.builder()
                .bucket(bucketName)
                .key(key)
                .build();
        try {
            s3Client.putObject(objectRequest, RequestBody.fromByteBuffer(totalOutputStream.toByteBuffer()));
        } catch (S3Exception e) {
            log.error("Failed to send raw data events to S3", e);
        }
    } else {
        log.warn("No valid events available for S3 upload");
    }
} catch (IOException e) {
    log.error("Error writing serialized data to total output stream", e);
} finally {
    // 关闭流(若ByteBufferOutputStream实现了Closeable接口)
    try {
        totalOutputStream.close();
    } catch (IOException e) {
        log.error("Failed to close total output stream", e);
    }
}

关键优化点

  • 复用单个输出流,降低内存碎片和对象创建开销
  • 仅发起一次S3上传请求,减少HTTP握手和往返时间,大幅提升上传效率
  • 增加空内容检查,避免上传无意义的空文件
  • 保留原有的错误处理逻辑,确保单个对象序列化失败不影响整体上传

内容的提问来源于stack exchange,提问作者CyberPunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:15:33