Java 读取和写入AmazonS3存储桶中的文件

Java 读取和写入AmazonS3存储桶中的文件,java,amazon-web-services,amazon-s3,aws-lambda,aws-sdk,Java,Amazon Web Services,Amazon S3,Aws Lambda,Aws Sdk,我需要从AmazonS3存储桶中读取一个大的(>15mb)文件(比如sample.csv)。然后,我需要处理sample.csv中存在的数据,并继续将其写入S3 bucket中的另一个目录。我打算使用AWS Lambda函数来运行我的java代码 作为第一步,我开发了在本地系统上运行的java代码。java代码从S3存储桶读取sample.csv文件,我使用put方法将数据写回S3存储桶。但我发现只有最后一行被处理并放回去了 Region clientRegion = Region.Myregi

我需要从AmazonS3存储桶中读取一个大的(>15mb)文件(比如
sample.csv
)。然后,我需要处理
sample.csv
中存在的数据,并继续将其写入S3 bucket中的另一个目录。我打算使用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));
}
我的输出应该是

1,mas,XX,java,beginner;
2,mot,XX,python,practitioner;
3,nhoj,XX,c#,expert. 
但是只有
3,nhoj,XX,c#,expert
被写入
Testout.csv

putObject()
方法创建了一个AmazonS3对象

无法追加或修改S3对象,因此每次执行
循环时,它都会创建一个新的AmazonS3对象

相反,我建议:

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

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

将文件读入内存/缓冲区,然后在lambda中动态处理,然后将修改/处理的数据写入s3。如上所述,putObject仅向s3写入最后一行。如果本地文件位于AWS Elasticbeanstalk-TomCat容器上,这与如何操作相同吗?@Duracelldemanaco请创建一个新问题,而不是通过对旧问题的注释进行提问。如上所述,您不能附加或修改s3对象。一种选择是使用AWS存储网关。
1,mas,XX,java,beginner;
2,mot,XX,python,practitioner;
3,nhoj,XX,c#,expert.