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

Java如何读取Amazon S3存储的JSON文件并转CSV后回传S3(无需本地存储)

实现方案

核心思路

全程在内存中完成CSV内容生成,直接将内存流上传到S3,无本地文件存储操作。

前置修正

你现有代码存在空指针风险,需要先初始化studentList:

List<Student> studentList = new ArrayList<>(); // 替换原来的null声明

如果你的项目中已经使用StringUtils.UTF8,可以替换下文代码中的StandardCharsets.UTF_8


方案1:使用OpenCSV生成(推荐,自动处理转义等异常场景)

第一步:引入Maven依赖

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>

第二步:内存生成CSV并上传S3

try (
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
    // 指定分隔符为制表符,和你样例格式对齐,也可以改成逗号','
    CSVWriter csvWriter = new CSVWriter(streamWriter, '\t', CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END)
) {
    // 写入表头
    String[] header = {"ID", "score", "grade"};
    csvWriter.writeNext(header);

    // 遍历学生列表写入行数据
    for (Student student : studentList) {
        int totalScore = student.mscore + student.cscore;
        String[] row = {
            "\"" + student.ID + "\"", // ID加引号,对齐样例格式
            String.valueOf(totalScore),
            student.grade
        };
        csvWriter.writeNext(row);
    }
    // 刷入所有缓冲数据
    csvWriter.flush();

    // 直接上传内存流到S3
    byte[] csvBytes = outputStream.toByteArray();
    ByteArrayInputStream inputStream = new ByteArrayInputStream(csvBytes);
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(csvBytes.length);
    metadata.setContentType("text/csv");
    metadata.setContentEncoding("UTF-8");

    s3Client.putObject(
        new PutObjectRequest(targetBucketName, targetFileKey, inputStream, metadata)
    );
} catch (IOException e) {
    // 自定义异常处理逻辑
    e.printStackTrace();
}

方案2:无第三方依赖手动拼接(仅适合简单固定场景)

try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)) {
    // 写入表头
    writer.write("ID\tscore\tgrade\n");
    // 写入行数据
    for (Student student : studentList) {
        int totalScore = student.mscore + student.cscore;
        writer.write(String.format("\"%s\"\t%d\t%s\n", student.ID, totalScore, student.grade));
    }
    writer.flush();

    // 上传S3逻辑和方案1完全一致
    byte[] csvBytes = outputStream.toByteArray();
    ByteArrayInputStream inputStream = new ByteArrayInputStream(csvBytes);
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(csvBytes.length);
    metadata.setContentType("text/csv");
    metadata.setContentEncoding("UTF-8");

    s3Client.putObject(
        new PutObjectRequest(targetBucketName, targetFileKey, inputStream, metadata)
    );
} catch (IOException e) {
    // 自定义异常处理逻辑
    e.printStackTrace();
}

参数说明

  • targetBucketName:目标CSV文件要上传到的S3存储桶名称
  • targetFileKey:目标CSV文件在S3中的存储路径,例如output/file.csv

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:57:02