使用 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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月22日 13:50:48
下一篇 2025年11月22日 14:23:26

相关推荐

  • 山寨币领域有哪些有哪些潜力币种

    以太坊因机构资金流入和质押机制推动价格上涨,Web3Bay凭借去中心化电商模式获980万美元投资,TON通过Layer 2升级提升性能,Chainlink在预言机市场占主导地位,Monero受益隐私需求增长,Beam助力区块链游戏发展,投资应聚焦技术落地与真实应用。 山寨币领域的潜力币种需结合技术创…

    好文分享 2025年12月9日
    000
  • 什么是Marlin(POND币)?它是如何运作的?POND代币新手指南

    目录 Marlin(POND)如何运作?生态系统发展(2024-2025年)POND 代币经济学、权益质押和治理市场表现和价格趋势战略合作伙伴关系和生态系统发展比较:Marlin 与其他 Layer-0 网络风险、可扩展性和长期愿景结论 marlin 是一个区块链layer 0协议,旨在加速去中心化…

    2025年12月9日 好文分享
    000
  • 目前能产生收益的RWA代币有哪些?

    CPE、SOLAR、DHB、EVA、CFG、PHARMA、GH2、WTR等RWA代币具备明确收益能力,涵盖新能源、房地产、债券、医药、氢能、净水等领域,年化收益从4%至35%不等,底层资产通过区块链确权与智能合约分配收益,结合AIoT和物联网技术保障数据真实与分配透明,投资者需关注合规性、数据验证及…

    2025年12月9日
    000
  • 主流比特币交易app排行榜 全球用户量八大比特币交易app榜单

    加密资产交易平台在数字经济浪潮中扮演着至关重要的角色,它们是连接用户与数字货币世界的桥梁。这些平台不仅提供数字资产的买卖服务,更发展出丰富的金融产品和生态系统,满足着全球用户日益增长的交易需求。随着数字货币市场的不断演进,交易所的规模、安全性、流动性、以及提供的服务种类,成为了衡量其综合实力的核心指…

    2025年12月9日 好文分享
    000
  • shib再过两年能消灭1个零吗

    柴犬币(SHIB)两年内有望达到0.0001美元,多家机构预测其2026至2028年可能实现破零,核心动力来自通缩销毁机制、Shibarium网络推动及生态扩展,但面临高流通量、市场竞争和实用性验证等挑战,需结合市场环境与长期发展综合评估。 柴犬币(SHIB)能否在两年内(即约2026年底前)删除一…

    2025年12月9日
    000
  • wlfi代币上交易所了吗

    WLFI代币目前尚未确认上线主流中心化交易所,投资者需通过官方渠道或CoinMarketCap、CoinGecko等平台核实其上市状态,若未上线,则可能仅在Uniswap、PancakeSwap等去中心化交易所(DEX)交易,用户可通过MetaMask等Web3存储连接DEX,输入官方获取的合约地址…

    2025年12月9日
    000
  • wlfi代币多少钱一个

    WLFI是LendFlare平台的治理代币,基于Convex Finance构建,用于优化Curve和Convex上的收益 farming。其价格受加密市场整体行情、平台TVL、治理与质押机制、供需关系及竞争环境影响。投资者可通过CoinGecko、CoinMarketCap或Uniswap等平台查…

    2025年12月9日
    000
  • 币圈头部账号8月都关注哪些币?

    DeFAI、DeFi和DeSci成为8月加密市场三大主流叙事,GRIFT、LINK、URO等代币获KOL关注,DeFAI涨45%、DeSci涨78%,ARB、APT、TAO被实盘做多盈利,MAGACOIN、XRP、PEPE受社区热捧,市场情绪向好但风险犹存。 8月的加密货币市场热闹非凡,头部交易员和…

    2025年12月9日
    000
  • 加密货币市场8月最受关注的项目有哪些

    2025年8月加密市场聚焦AI与区块链融合、RWA、高性能公链及实用型Memecoin,Ozak AI、Pepeto、BlockDAG、Sui、TRON等项目表现亮眼,资金活跃但伴随高风险,需警惕代币解锁带来的抛压及市场波动。 2025年8月的加密货币市场,资金活跃,创新涌动。投资者目光不再局限于比…

    2025年12月9日
    000
  • Tokens 在物联网区块链中的应用潜力探索

    Tokens在物联网区块链中作为价值媒介,通过智能合约实现设备间自动化微支付与数据共享激励,结合区块链去中心化信任与设备数字身份,推动智能城市、供应链等场景落地,同时面临可扩展性、安全性和互操作性等挑战。 物联网(IoT)与区块链技术的融合,正在开启一个前所未有的新纪元。想象一下,您的智能家居设备不…

    2025年12月9日
    000
  • 主流交易所 Tokens 交易激增原因

    主流交易所代币交易活跃度激增,源于其生态赋能、通缩机制、市场情绪回暖、合规进展及营销推动。BNB、OKB、HT等代币通过手续费折扣、IEO参与、回购销毁等机制增强实用性与稀缺性,叠加交易所品牌效应与社区扩张,吸引资金流入。分析其活跃度需结合交易量、持币地址数、链上活跃度、官方动态、社交媒体情绪及衍生…

    2025年12月9日 好文分享
    000
  • Tokens 在跨境汇款中的优势与阻碍分析

    Tokens凭借区块链的去中心化、不可篡改和高效率特性,实现跨境汇款的瞬时价值转移,显著降低手续费与中间环节,提升全球资金流通效率,但面临监管差异、价格波动、技术门槛及安全合规等挑战,需通过稳定币与高效链网结合主流平台操作,并强化地址核对、私钥管理与合规意识以管控风险。 在数字经济浪潮席卷全球的当下…

    2025年12月9日
    000
  • Tokens 流动性危机如何破局?

    应对Tokens流动性危机需多管齐下:首先提升项目价值与透明度,通过技术创新、社区建设和信息披露增强信心;其次优化交易基础设施,促进多链部署与跨链互操作,提升CEX和DEX市场深度,引入专业做市商;再次强化市场监管,打击操纵行为,推行分级管理与强制审计;最后加强投资者教育,普及风险知识,倡导理性投资…

    2025年12月9日
    000
  • 灰度提交狗狗币ETF申请 如何将狗狗币ETF加入您的投资组合

    灰度已向美国证券交易委员会提交了一项 S-1 注册声明,拟将现有的Grayscale Dogecoin Trust转为现货狗狗币ETF,若获批准,该ETF将以“GDOG”为交易代码,在NYSE Arca上市。该结构允许投资者通过传统经纪账户获得狗狗币敞口,无需直接接触加密交易所或管理数字荷包。申请已…

    2025年12月9日
    000
  • 加密货币交易所下单之后还能够取消吗?

    未成交订单可取消,已成交则不可;部分成交可撤销剩余部分。用户可随时取消未成交订单,资金立即返还,但频繁取消可能触发交易所限制,尤其在C2C交易中,新用户单日取消超5次或老用户超3次可能被限制交易。币币和合约交易中,频繁撤单虽无直接惩罚,但可能被视为异常行为。系统会在订单超时、交易对下架、系统维护或保…

    2025年12月9日
    000
  • 国内最常用的加密货币交易所有哪些?

    币安、欧易OKX、火币HTX是国内用户最常用且广受认可的加密货币交易所,凭借强大的流动性、安全性及中文服务优势,成为主流选择,而Bitget的跟单交易和Bybit的衍生品服务也各具特色,适合不同需求的投资者。 对于国内加密货币爱好者来说,选择一个常用且可靠的交易平台是踏入这个领域的第一步。尽管相关监…

    2025年12月9日
    000
  • 日元稳定币叫什么?什么时候发行?哪里可以买?

    日本首个日元稳定币JPYC将于2025年秋季完成注册后数周内正式发行,由JPYC Inc.发行并以1:1锚定日元,储备资产为日本国债和银行存款,目标三年内发行1万亿日元,初期仅面向日本国内用户通过合规交易所或直接申请购买。 目前市场上被广泛认可的日元稳定币名为**JPYC**,由日本金融科技公司JP…

    2025年12月9日
    000
  • Tokens 市场监管新规出台,行业走向何方

    全球数字资产监管趋严,2025年二季度美欧港推进稳定币立法,美国通过三项加密法案,比特币市值上涨,合规化推动市场成熟,技术创新与监管科技协同发展。 近期,全球金融市场迎来了一项重大变革——Tokens市场监管新规的正式出台。这一消息如同巨石投入平静的湖面,激起了千层浪花,让所有关注数字资产领域的投资…

    2025年12月9日
    000
  • Tokens 项目开发者如何吸引更多用户

    Tokens项目需通过提升产品吸引力、加强市场推广、构建活跃社区、利用中心化与去中心化%ignore_a_1%、实施用户激励、拓展跨链技术及NFT应用,并高效处理用户反馈,全方位吸引并留住用户,实现生态繁荣与长期发展。 在加密货币领域,一个优质的Tokens项目不仅需要创新的技术和明确的商业模式,更…

    2025年12月9日 好文分享
    000
  • 2025年十大最具潜力的数字货币交易平台推荐

    以下为2025年十大最具潜力的数字货币交易平台推荐 1. binance 全球领先的交易规模,提供丰富的现货、合约与理财工具。持续拓展BNB Chain生态,推动Web3应用落地。安全措施成熟,采用多重验证与冷钱 包储备。手续费优惠政策吸引了大量长期用户。 2. OKX 积极布局Web3,推出多链钱…

    2025年12月9日 好文分享
    000

发表回复

登录后才能评论
关注微信