我的方法接收一个缓冲的读取器,并转换文件中的每一行。但是,我需要将此转换的输出上载到s3存储桶。文件很大,因此我希望能够将上传的内容流式传输到s3对象中。
为此,我认为我需要使用分段上传,但是由于似乎没有任何上传,我不确定我是否使用正确。
这是我的方法:
public void transform(BufferedReader reader)
{
Scanner scanner = new Scanner(reader);
String row;
List<PartETag> partETags = new ArrayList<>();
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest("output-bucket", "test.log");
InitiateMultipartUploadResult result = amazonS3.initiateMultipartUpload(request);
while (scanner.hasNext()) {
row = scanner.nextLine();
InputStream inputStream = new ByteArrayInputStream(row.getBytes(Charset.forName("UTF-8")));
log.info(result.getUploadId());
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName("output-bucket")
.withKey("test.log")
.withUploadId(result.getUploadId())
.withInputStream(inputStream)
.withPartNumber(1)
.withPartSize(5 * 1024 * 1024);
partETags.add(amazonS3.uploadPart(uploadRequest).getPartETag());
}
log.info(result.getUploadId());
CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(
"output-bucket",
"test.log",
result.getUploadId(),
partETags);
amazonS3.completeMultipartUpload(compRequest);
}
答案 0 :(得分:0)
哦,我明白了。 InitiateMultipartUploadRequest 需要从输入流中读取。这是一个有效的约束,因为您通常只能写入输出流。
您可能听说过可以将数据从InputStream复制到 ByteArrayOutputStream 。然后采用结果字节数组并创建一个 ByteArrayInputStream 。您可以将其提供给您的请求对象。但是:所有数据将在特定时间以一个字节数组存储。由于您的用例是关于大文件的,所以不能确定。
您需要创建一个自定义输入流类,该类将原始输入流转换为另一个输入流。它要求您进行字节级抽象。但是,它将提供最佳性能。我建议问一个新问题,如果您想进一步了解这一点。
您的转换代码已经完成,您不想再次触摸它吗?还有另一种方法。您也可以使用管道:https://howtodoinjava.com/java/io/convert-outputstream-to-inputstream-example/将输出流“连接”到输入流。问题在于:您正在此处处理多线程。