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

标签 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. 

但是Testout.csv中只写入了3,nhoj,XX,c#,expert

最佳答案

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

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

相反,我建议:

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

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

关于java - 读取和写入 Amazon s3 存储桶中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56556470/

相关文章:

ios - 如何使用 iOS 将文件上传到 Amazon S3 并获取 url 作为响应

ios - 从 Cognito 向客户端发布身份验证自定义响应

java - json extra 在其他 Intent 上为 null

java - 为什么在为我的玩家分配名称时会出现空指针异常?

java - 添加两个同名的 ldap 属性

java - 通过Java SDK在AWS上使用Hadoop创建数据库

amazon-web-services - 如何在树莓派上安装 awscli 版本 2

ios - 从 iOS (Swift) 上的 AWS S3 存储桶并行下载对象

internet-explorer - 存储在 Amazon AWS S3 上的图像未在 Internet Explorer 中呈现

java - 我们如何从数组列表中删除重复的条目