首页 > 解决方案 > 读取和写入 Amazon s3 存储桶中的文件

问题描述

我需要sample.csv从 Amazon S3 存储桶中读取一个大(>15mb)文件(比如)。然后,我需要处理存在的数据sample.csv并将其写入 S3 存储桶中的另一个目录。我打算使用 AWS Lambda 函数来运行我的 java 代码。

作为第一步,我开发了在本地系统上运行的 java 代码。Java 代码从 S3 存储桶中读取sample.csv文件,我使用该put方法将数据写回 S3 存储桶。但我发现只有最后一行被处理并放回。

Region clientRegion = Region.Myregion;    
AwsBasicCredentials awsCreds = AwsBasicCredentials.create("myAccessId","mySecretKey");    
S3Client s3Client = S3Client.builder().region(clientRegion).credentialsProvider(StaticCredentialsProvider.create(awsCreds)).build();    
ResponseInputStream<GetObjectResponse> s3objectResponse = s3Client.getObject(GetObjectRequest.builder().bucket(bucketName).key("Input/sample.csv").build());    
BufferedReader reader = new BufferedReader(new InputStreamReader(s3objectResponse));    
String line = null;
while ((line = reader.readLine()) != null) {
                s3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key("Test/Testout.csv").build(),RequestBody.fromString(line));
}

示例:sample.csv 包含

1,sam,21,java,beginner;
2,tom,28,python,practitioner;
3,john,35,c#,expert.

我的输出应该是

1,mas,XX,java,beginner;
2,mot,XX,python,practitioner;
3,nhoj,XX,c#,expert. 

但只3,nhoj,XX,c#,expert写在Testout.csv.

标签: javaamazon-web-servicesamazon-s3aws-lambdaaws-sdk

解决方案


putObject()方法创建一个 Amazon S3 对象。

无法附加或修改 S3 对象,因此每次while执行循环时,都会创建一个新的 Amazon S3 对象。

相反,我建议:

  • 将源文件从 Amazon S3下载GetObject()到本地磁盘(与 adestinationFile一起下载到磁盘)
  • 处理文件并输出到本地文件
  • 将输出文件上传到 Amazon S3 存储桶(方法

这将 AWS 代码与您的处理代码分开,这应该更易于维护。


推荐阅读