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
相关产品推荐
相关产品推荐

