使用 Spring Boot 从 AWS S3 读取 JSON 对象列表

使用 spring boot 从 aws s3 读取 json 对象列表

本文将指导你如何使用 Spring Boot 和 AWS SDK 从 S3 存储桶中读取包含多个 JSON 行的文件,并将这些行转换为 Java 对象列表。我们将会探讨两种不同的实现方式:一种是将 S3 文件读取到本地文件系统,然后进行处理;另一种是直接在内存中处理 S3 文件。

准备工作

首先,确保你已经配置好了 AWS 凭证,并且拥有访问 S3 存储桶的权限。你还需要在 pom.xml 文件中添加 AWS SDK 的依赖:

    software.amazon.awssdk    s3    2.17.285

假设你的 S3 存储桶中有一个名为 filename.txt 的文件,内容如下:

{   "name":"rohit",   "surname":"sharma"}{   "name":"virat",   "surname":"kohli"}

我们希望将每一行 JSON 数据解析为 Person 对象。

创建 Person 类

首先,创建一个简单的 Java 类 Person,用于存储 JSON 数据:

public class Person {    private String name;    private String surname;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSurname() {        return surname;    }    public void setSurname(String surname) {        this.surname = surname;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + ''' +                ", surname='" + surname + ''' +                '}';    }}

配置 AWS S3 客户端

创建一个配置类,用于初始化 AWS S3 客户端:

@Configurationpublic class AwsS3ClientConfig {    @Bean    public S3Client s3Client(){        AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create("ACCESS_KEY_ID", "SECRET_ACCESS_KEY");        return S3Client                .builder()                .region(Region.US_EAST_1)                .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials))                .build();    }}

请务必替换 “ACCESS_KEY_ID” 和 “SECRET_ACCESS_KEY” 为你实际的 AWS 凭证。 Region.US_EAST_1 也要替换成你S3桶所在的区域。

实现方式一:读取到本地文件系统

这种方式首先将 S3 文件下载到本地文件系统,然后读取文件内容并解析为 Person 对象列表。

@Servicepublic class AwsS3Service {    private final S3Client s3Client;    @Autowired    public AwsS3Service(S3Client s3Client) {        this.s3Client = s3Client;    }    public List readFileAndCreateList(String bucketName, String keyName) throws IOException {        final Path file = readFile(bucketName, keyName);        return convertFileToList(file);    }    private Path readFile(String bucketName, String keyName) throws IOException {        GetObjectRequest getObjectRequest = GetObjectRequest                .builder()                .bucket(bucketName)                .key(keyName)                .build();        final byte[] bytes = s3Client                .getObject(getObjectRequest)                .readAllBytes();        final Path path = Paths.get("demo.txt");        Files.write(path, bytes);        return path;    }    private List convertFileToList(Path path) throws IOException {        final List lines = Files.readAllLines(path);        StringBuilder json = new StringBuilder();        List persons=new ArrayList();        for (String line : lines) {            if ("{".equals(line)) {                json = new StringBuilder("{");            } else if ("}".equals(line)) {                json.append("}");               persons.add(new ObjectMapper()                        .readValue(json.toString(), Person.class));            } else {                json.append(line.trim());            }        }        return persons;    }}

这段代码首先通过 readFile 方法从 S3 下载文件,然后使用 convertFileToList 方法读取文件内容,逐行解析 JSON 数据,并将其转换为 Person 对象。

实现方式二:在内存中处理

这种方式直接从 S3 读取文件内容到内存,避免了创建本地文件的步骤。

@Servicepublic class AwsS3Service {    private final S3Client s3Client;    @Autowired    public AwsS3Service(S3Client s3Client) {        this.s3Client = s3Client;    }    public List readFileAndCreateObjectList(String bucketName, String keyName) throws IOException {        final List lines = readFile(bucketName, keyName);        return convertFileLinesToObjectList(lines);    }    private List readFile(String bucketName, String keyName) throws IOException {        GetObjectRequest getObjectRequest = GetObjectRequest                .builder()                .bucket(bucketName)                .key(keyName)                .build();        byte[] bytes;        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {            s3Client                    .getObject(getObjectRequest)                    .transferTo(byteArrayOutputStream);            bytes = byteArrayOutputStream.toByteArray();        }        List lines=new ArrayList();        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);            InputStreamReader inputStreamReader = new InputStreamReader(byteArrayInputStream);            BufferedReader bufferedReader=new BufferedReader(inputStreamReader)){           while (bufferedReader.ready()){              lines.add(bufferedReader.readLine());           }        }        return lines;    }    private List convertFileLinesToObjectList(List lines) throws IOException {        StringBuilder json = new StringBuilder();        List persons = new ArrayList();        for (String line : lines) {            if ("{".equals(line)) {                json = new StringBuilder("{");            } else if ("}".equals(line)) {                json.append("}");                persons.add(new ObjectMapper()                        .readValue(json.toString(), Person.class));            } else {                json.append(line.trim());            }        }        return persons;    }}

这段代码使用 ByteArrayOutputStream 和 ByteArrayInputStream 将 S3 文件内容读取到内存中,然后使用 BufferedReader 逐行读取并解析 JSON 数据。

使用示例

创建一个 Spring Boot 应用,并在 CommandLineRunner 中调用上述服务:

@SpringBootApplicationpublic class DemoApplication implements CommandLineRunner {    private final AwsS3Service awsS3Service;    @Autowired    public DemoApplication(AwsS3Service awsS3Service) {        this.awsS3Service = awsS3Service;    }    public static void main(String[] args) {        SpringApplication.run(DemoApplication.class);    }    @Override    public void run(String... args) throws Exception {        //KEY_NAME==filename.txt        final List peoples =                awsS3Service                        .readFileAndCreateList("BUCKET_NAME", "KEY_NAME");        System.out.println(peoples);    }}

请将 “BUCKET_NAME” 和 “KEY_NAME” 替换为你实际的 S3 存储桶名称和文件名称。

注意事项

异常处理: 在实际应用中,需要添加更完善的异常处理机制,例如处理 S3 连接错误、文件不存在等情况。性能优化: 如果文件非常大,可以考虑使用 S3 Select API 进行过滤,或者使用分页读取的方式来减少内存占用。JSON 解析: 使用 ObjectMapper 解析 JSON 数据时,需要确保 JSON 格式正确,否则会抛出异常。资源释放: 在处理 I/O 流时,务必使用 try-with-resources 语句确保资源被正确释放。

总结

本文介绍了两种使用 Spring Boot 和 AWS SDK 从 S3 读取 JSON 对象列表的方法。第一种方法将 S3 文件下载到本地文件系统,然后进行处理;第二种方法直接在内存中处理 S3 文件,避免了创建本地文件的步骤。选择哪种方法取决于你的具体需求和文件大小。希望本文能够帮助你更好地理解如何在 Spring Boot 应用中使用 AWS S3。

以上就是使用 Spring Boot 从 AWS S3 读取 JSON 对象列表的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/107287.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用Hyperf框架进行接口测试
上一篇 2025年11月22日 14:03:06
Sublime结合VSCode使用技巧对比_选择最适合你的前端开发环境
下一篇 2025年11月22日 14:07:10

相关推荐

  • Java中指定范围内素数查找与数组返回的实现教程

    Java中指定范围内素数查找与数组返回的实现教程Java中指定范围内素数查找与数组返回的实现教程Java中指定范围内素数查找与数组返回的实现教程Java中指定范围内素数查找与数组返回的实现教程

    本教程将详细介绍如何在Java中高效地查找指定范围内的所有素数,并将这些素数收集到一个整型数组中返回。我们将探讨素数判断方法的优化,动态数据收集(使用ArrayList)的策略,以及如何利用Java 8 Stream API将列表转换为数组,并提供完整的代码示例和使用注意事项。 1. 素数判断方法 …

    2026年9月30日 • 用户投稿
    100
  • ​Windows 11 任务栏新添 AI 助手 “Taskbar Companion”

    ​Windows 11 任务栏新添 AI 助手 “Taskbar Companion”​Windows 11 任务栏新添 AI 助手 “Taskbar Companion”​Windows 11 任务栏新添 AI 助手 “Taskbar Companion”​Windows 11 任务栏新添 AI 助手 “Taskbar Companion”

    微软公司正深入测试 Windows 11 任务栏的一项全新功能,代号为“Taskbar Companion”(任务栏伴侣)的 AI 助手逐渐进入公众视野,引发广泛关注。该功能的目标是提升用户与智能助手及各类智能体之间的交互效率。数周以来,关于这一实验性模块的消息陆续曝光,最近又出现了新的技术线索,进…

    2026年9月30日 • 用户投稿
    000
  • 托方大同的“符”,在视频号与75万网友达成共鸣

    托方大同的“符”,在视频号与75万网友达成共鸣托方大同的“符”,在视频号与75万网友达成共鸣托方大同的“符”,在视频号与75万网友达成共鸣托方大同的“符”,在视频号与75万网友达成共鸣

    作者 | 金鑫yoyo ​缘 起 3月1日,方大同因病去世的信息正式公布。 当时,内心“咯噔”一下,突然感觉我们这代人也开始进入“离开倒计时”了。 耳边除了响起林夕写的那首《开到荼蘼》,还涌现了罗永浩在直播间里讲过的话: “我今年50岁了,我的朋友圈里已经偶尔就有一个人去世了。20-30岁时你肯定没…

    2026年9月30日 • 用户投稿
    000
  • 生存掠夺射击游戏《无尽猎杀》Steam试玩现已开启!

    发行商Assemble Entertainment发布了最新一款令人肾上腺素飙升的独立游戏——《无尽猎杀》,这是一款由乌克兰开发商Pushka Studios打造的高燃动作肉鸽游戏。该游戏在科隆游戏展精彩独立游戏环节现场公布,将经典的生存者玩法与深度的掠夺射击游戏成长系统相结合,背景设定在一个被恶魔…

    2026年9月30日
    100
  • Sublime写模型训练日志监控脚本_适用于机器学习任务过程追踪

    Sublime写模型训练日志监控脚本_适用于机器学习任务过程追踪Sublime写模型训练日志监控脚本_适用于机器学习任务过程追踪Sublime写模型训练日志监控脚本_适用于机器学习任务过程追踪Sublime写模型训练日志监控脚本_适用于机器学习任务过程追踪

    %ignore_a_1% text 通过构建系统与 python 脚本协同工作,可实现日志监控。1. 创建 monitor.py 脚本,记录读取位置并持续输出新增内容;2. 配置 sublime text 构建系统 monitorlog.sublime-build,指定 python 运行脚本及日志…

    2026年9月30日 • 用户投稿
    000
  • 从太空看NVIDIA的 “奋进号” 总部:无处不在的三角形

    从太空看NVIDIA的 “奋进号” 总部:无处不在的三角形从太空看NVIDIA的 “奋进号” 总部:无处不在的三角形从太空看NVIDIA的 “奋进号” 总部:无处不在的三角形从太空看NVIDIA的 “奋进号” 总部:无处不在的三角形

    9月23日消息,在硅谷这片科技热地之中,每当一家科技公司脱颖而出,其总部大楼往往成业界关注的焦点。 NVIDIA,AI行业最为炙手可热的明星企业,市值已经高达4.3万亿美元,它的新总部大楼,一个为协作创新设计的未来办公场所,也承载了NVIDIA 的品牌理念。 NVIDIA总部大楼名为“Endeavo…

    2026年9月30日 • 用户投稿
    000
  • 将 XML Bean 定义迁移到 @Configuration 注解类

    将 XML Bean 定义迁移到 @Configuration 注解类 本文将指导您如何将 Spring 应用中基于 XML 的 JMS Bean 定义迁移到使用 @Configuration 注解的 Java 类中。通过示例,我们将展示如何使用 @Bean 注解创建 JmsTemplate 和 J…

    2026年9月30日
    000
  • windows资源监视器怎么用_资源监视器性能分析与使用指南

    资源监视器可精确定位电脑卡顿根源。通过Win+R输入resmon或任务管理器打开,利用CPU、内存、磁盘、网络标签页分别查看高占用进程、内存泄漏、I/O瓶颈及异常网络连接,结合排序与勾选功能深度分析系统性能问题。 如果您发现电脑运行缓慢、程序无响应或网络卡顿,可能是因为某些后台进程过度占用系统资源。…

    2026年9月30日
    000
  • Java中利用正则表达式实现字符串特定单词的忽略大小写替换

    本教程旨在解决如何在字符串中高效地将特定单词的所有大小写变体统一转换为指定大小写形式的问题。通过引入正则表达式的“大小写不敏感”匹配模式,我们能够避免为每种变体编写单独的替换规则,从而实现简洁、灵活且强大的字符串处理,显著提升代码效率和可维护性。 传统替换方法的局限性 在字符串处理中,我们经常会遇到…

    2026年9月30日
    000
  • 豆包AI安装后权限被系统阻止 豆包AI系统权限配置与安全例外设置

    豆包AI安装后权限被系统阻止 豆包AI系统权限配置与安全例外设置豆包AI安装后权限被系统阻止 豆包AI系统权限配置与安全例外设置豆包AI安装后权限被系统阻止 豆包AI系统权限配置与安全例外设置豆包AI安装后权限被系统阻止 豆包AI系统权限配置与安全例外设置

    本文将围绕豆包AI在安装后可能遇到的系统权限阻止问题进行详细说明。通过对系统安全设置的调整以及添加应用程序为例外项的操作,可以有效解决此问题。接下来的内容将分步骤引导您完成整个配置过程,旨在帮助您理解并顺利完成操作,确保豆包AI的正常运行。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费…

    2026年9月30日 • 用户投稿
    000
  • 提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧

    提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧

    Java枚举通过封装数据和行为,提供类型安全、避免魔法值,提升代码可读性与可维护性,如订单状态枚举可携带状态码、描述及处理逻辑,并支持策略模式,取代冗长if-else,实现清晰多态。 Java枚举,远不止是简单的常量集合,它是提升代码健壮性、可读性和可维护性的利器。通过它,我们能将一组固定的、有限的…

    2026年9月30日 • 用户投稿
    100
  • sublime如何优化Ruby开发体验 sublime高效编写Ruby代码的技巧

    sublime如何优化Ruby开发体验 sublime高效编写Ruby代码的技巧sublime如何优化Ruby开发体验 sublime高效编写Ruby代码的技巧sublime如何优化Ruby开发体验 sublime高效编写Ruby代码的技巧sublime如何优化Ruby开发体验 sublime高效编写Ruby代码的技巧

    选择插件时应优先考虑代码提示、语法高亮、错误检查、代码片段、格式化和测试支持;2. 安装sublimerspec和testunit以便捷运行测试;3. 使用ruby bundle或自定义snippets提升编码速度;4. 配置sublimelinter与rubocop实现语法检查和代码格式化;5. …

    2026年9月30日 • 用户投稿
    300
  • 多模态AI模型部署硬件选型 多模态AI服务器配置推荐清单

    多模态AI模型部署硬件选型 多模态AI服务器配置推荐清单多模态AI模型部署硬件选型 多模态AI服务器配置推荐清单多模态AI模型部署硬件选型 多模态AI服务器配置推荐清单多模态AI模型部署硬件选型 多模态AI服务器配置推荐清单

    本文将围绕多模态AI模型部署的硬件选型问题展开叙述。首先,我们会深入分析多模态模型对硬件的核心需求,接着,将提供一个清晰的分步指南,讲解如何根据具体应用场景进行硬件的合理选配。最后,会给出一份具体的服务器配置推荐清单,帮助您直观地理解各组件的搭配方案,从而为您的AI项目构建一个高效、稳定的硬件基础。…

    2026年9月30日 • 用户投稿
    000
  • 华为Mate 80系列“十大黑科技”曝光 含新一代红枫镜头

    华为Mate 80系列“十大黑科技”曝光 含新一代红枫镜头华为Mate 80系列“十大黑科技”曝光 含新一代红枫镜头华为Mate 80系列“十大黑科技”曝光 含新一代红枫镜头华为Mate 80系列“十大黑科技”曝光 含新一代红枫镜头

    近日,数码博主曝光了华为mate 80系列旗舰手机的“十大黑科技”配置细节。作为华为2025年的重磅新品,该系列预计将于11月正式发布,涵盖四款机型:mate 80、mate 80 pro、mate 80 pro+以及mate 80 rs非凡大师版。 华为Mate 70系列 双层OLED屏幕技术突破…

    2026年9月30日 • 用户投稿
    100
  • Java中Try-Catch块与循环的正确使用方法

    Java中Try-Catch块与循环的正确使用方法Java中Try-Catch块与循环的正确使用方法Java中Try-Catch块与循环的正确使用方法Java中Try-Catch块与循环的正确使用方法

    本文旨在阐明在Java编程中,当try-catch块与for循环结合使用时,异常处理如何影响循环的执行流程。通过分析一个汽车租赁服务的示例,详细解释了将try-catch块放置在循环外部和内部的区别,并提供了正确的代码结构以确保程序在遇到异常时能够继续执行。 在Java编程中,合理地使用try-ca…

    2026年9月30日 • 用户投稿
    000
  • sublime如何实现AI代码补全 sublime集成Copilot的替代方案

    sublime如何实现AI代码补全 sublime集成Copilot的替代方案sublime如何实现AI代码补全 sublime集成Copilot的替代方案sublime如何实现AI代码补全 sublime集成Copilot的替代方案sublime如何实现AI代码补全 sublime集成Copilot的替代方案

    sublime text需通过插件实现ai代码补全,因其本身不集成ai功能,但可通过package control安装如tabnine等插件来实现;2. tabnine支持多语言和本地补全,保护隐私且无需订阅,但智能性略逊于copilot;3. 可通过编写自定义插件调用openai api实现补全,…

    2026年9月29日 • 用户投稿
    200
  • Try-Catch 块与 For 循环的协同工作:异常处理与循环控制

    Try-Catch 块与 For 循环的协同工作:异常处理与循环控制Try-Catch 块与 For 循环的协同工作:异常处理与循环控制Try-Catch 块与 For 循环的协同工作:异常处理与循环控制Try-Catch 块与 For 循环的协同工作:异常处理与循环控制

    在软件开发中,异常处理是确保程序稳定性的关键环节。当 try-catch 块与 for 循环结合使用时,异常的处理方式会直接影响循环的执行流程。理解这种交互对于编写健壮且能有效处理错误的程序至关重要。 Try-Catch 块与 For 循环的交互 正如文章摘要所说,本文深入探讨了在 try-catc…

    2026年9月29日 • 用户投稿
    100
  • 计算Java中两个日期时间之间的天、时、分、秒差

    计算Java中两个日期时间之间的天、时、分、秒差计算Java中两个日期时间之间的天、时、分、秒差计算Java中两个日期时间之间的天、时、分、秒差计算Java中两个日期时间之间的天、时、分、秒差

    本文旨在指导Java开发者如何计算给定日期时间(例如:”Wednesday 02-October-2022 11:51:1 PM”)与当前时间之间的天数、小时数、分钟数和秒数差。文章将详细介绍如何使用DateTimeFormatter解析日期和时间字符串,如何处理时区信息,以…

    2026年9月29日 • 用户投稿
    100
  • 豆包AI安装包哈希值验证 豆包AI文件完整性校验步骤

    豆包AI安装包哈希值验证 豆包AI文件完整性校验步骤豆包AI安装包哈希值验证 豆包AI文件完整性校验步骤豆包AI安装包哈希值验证 豆包AI文件完整性校验步骤豆包AI安装包哈希值验证 豆包AI文件完整性校验步骤

    本文将围绕豆包AI安装包的哈希值验证问题进行说明。哈希值,可以理解为文件的数字指纹,每个文件都有一个独特的、固定长度的哈希值。通过验证下载的安装包哈希值与官方提供的是否一致,可以有效判断文件在传输过程中是否被篡改或损坏,从而保障其完整性和安全性。接下来的内容将通过详细的步骤讲解,指导您如何获取官方哈…

    2026年9月29日 • 用户投稿
    100
  • 生成准确表达文章主题的标题在循环中使用 Try-Catch 块:确保程序持续运行

    生成准确表达文章主题的标题在循环中使用 Try-Catch 块:确保程序持续运行生成准确表达文章主题的标题在循环中使用 Try-Catch 块:确保程序持续运行生成准确表达文章主题的标题在循环中使用 Try-Catch 块:确保程序持续运行生成准确表达文章主题的标题在循环中使用 Try-Catch 块:确保程序持续运行

    本文探讨了在循环结构(特别是 for 循环)中使用 try-catch 块的正确方法。通过将 try-catch 块放置在循环内部,即使在某次迭代中发生异常,程序也能捕获并处理该异常,从而保证循环的其余部分继续执行,避免程序因异常而中断。本文将通过示例代码详细解释这种方法,并提供实际应用中的注意事项…

    2026年9月29日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信