读取和写入Amazon s3存储桶中的文件

时间:2019-06-12 07:08:10

标签: java amazon-web-services amazon-s3 aws-lambda aws-sdk

我需要从Amazon S3存储桶中读取大文件(> 15mb)(例如sample.csv)。然后,我需要处理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

1 个答案:

答案 0 :(得分:3)

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

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

相反,我建议:

  • 下载从Amazon S3到本地磁盘(将GetObject()destinationFiledownload一起使用到磁盘)
  • 处理文件并输出到本地文件
  • 上传输出文件到Amazon S3存储桶(method

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