如何为JSON Parser提供S3文件引用?两种方式均报FileNotFoundException
解决S3文件JSON解析时的FileNotFoundException问题
嗨,我来帮你搞定这个报错!你遇到的java.io.FileNotFoundException本质原因很简单:FileReader这个类只能读取本地文件系统里的文件,它完全不支持S3存储桶路径或者HTTP URL这两种资源形式,所以才会找不到文件。
先给你拆解下两种尝试方式的问题:
- 第一种用
bucket+"/"+key作为路径:S3的存储桶和对象键并不是本地磁盘的文件路径,FileReader会把它当成你电脑本地的文件夹/文件去查找,自然找不到对应的资源。 - 第二种直接传S3的HTTP URL:
FileReader只认识本地文件的路径格式,根本不懂HTTP协议的资源地址,所以同样会报错。
正确的解决方法
你需要借助AWS SDK来获取S3对象的输入流,再把这个流传给JSON解析器。下面给你两种常用SDK版本的示例:
方式1:使用AWS SDK v2(推荐,最新版本)
// 初始化S3客户端(记得替换成你的区域) S3Client s3Client = S3Client.builder().region(Region.US_EAST_1).build(); // 构造获取对象的请求 GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket("你的存储桶名称") .key("你的对象键") .build(); // 获取S3对象的输入流 InputStream s3InputStream = s3Client.getObject(getObjectRequest); // 解析JSON JSONParser parser = new JSONParser(); JSONArray a = (JSONArray) parser.parse(new InputStreamReader(s3InputStream)); // 生产环境建议用try-with-resources自动关闭资源,这里手动示例 s3InputStream.close(); s3Client.close();
方式2:使用AWS SDK v1
如果你还在使用旧版SDK,可以这么写:
// 初始化S3客户端 AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); // 获取S3对象 S3Object s3Object = s3Client.getObject("你的存储桶名称", "你的对象键"); InputStream s3InputStream = s3Object.getObjectContent(); // 解析JSON JSONParser parser = new JSONParser(); JSONArray a = (JSONArray) parser.parse(new InputStreamReader(s3InputStream)); // 关闭资源 s3InputStream.close(); s3Object.close(); s3Client.shutdown();
备选方案:通过HTTP URL获取流(不推荐生产环境)
如果一定要用S3的HTTP URL来获取资源,可以用URL类打开连接获取输入流,但这种方式没有SDK的签名、重试等机制,权限处理也麻烦,只适合测试场景:
URL s3Url = new URL("你的S3对象HTTP URL"); InputStream urlInputStream = s3Url.openStream(); JSONParser parser = new JSONParser(); JSONArray a = (JSONArray) parser.parse(new InputStreamReader(urlInputStream)); urlInputStream.close();
内容的提问来源于stack exchange,提问作者Sachin Kasliwal
相关产品推荐
相关产品推荐

