【问题标题】:The best approach to write a large file using Spring Boot and AWS使用 Spring Boot 和 AWS 编写大文件的最佳方法
【发布时间】:2020-05-18 21:30:44
【问题描述】:

今天我有一个生成文件的过程,将其写入本地磁盘,然后上传到 S3。但是现在我想改变这个过程,我想在我通过流编写它的同时上传这个文件。我正在使用 aws-java-sdk,但我没有成功实施这种方法。

简单的代码来说明我想要做什么:

for (int i = 5000; i > 0; i--) {
                Upload upload;
                //create temp file
                File tempFile = File.createTempFile("teste", ".txt");

                //write
                OutputStream fos = new FileOutputStream(tempFile);
                Writer osw = new OutputStreamWriter(fos);
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write("Test-Upload");
                bw.newLine();
                bw.flush();

                //upload
                FileInputStream fis = new FileInputStream(tempFile);
                ObjectMetadata objectMetadata = new ObjectMetadata();
                objectMetadata.setContentLength(tempFile.length());
                upload = tm.upload(bucketName, key.concat(tempFile.getName()), fis, objectMetadata);
                upload.waitForUploadResult();
            }

今天我的平均问题是我在写入时将文件加载到内存中,并在发送到 S3 时再次加载它,我想改进这个过程,但我不知道是否是最好的方法和/或可能,因为在我的搜索中我没有找到很多这样的情况。

【问题讨论】:

    标签: java spring-boot amazon-s3 design-patterns aws-sdk


    【解决方案1】:

    如果是带有数据的文本文件,可以使用Firehose。它可以接收您的数据并将其流式传输到 S3 存储桶。

    public void publish(String data) {
            AmazonKinesisFirehose amaznonFirehose = amaznonFirehose();
            Record record = new Record().withData(ByteBuffer.wrap(data.getBytes()));
            PutRecordRequest putRecordRequest = new PutRecordRequest();
            putRecordRequest.setDeliveryStreamName("your-stream-name");
            putRecordRequest.setRecord(record);
            PutRecordResult putRecordResult = amaznonFirehose.putRecord(putRecordRequest);
    
        }
    
        private AmazonKinesisFirehose amaznonFirehose() {
            BasicAWSCredentials basicAwsCredentials = new BasicAWSCredentials(ACCESS_KEY,
                    SECRET_KEY);
            return AmazonKinesisFirehoseClient.builder().withRegion(REGION)
                    .withCredentials(new AWSStaticCredentialsProvider(basicAwsCredentials)).build();
        }
    

    只需将您的文本发布到 Firehose 流中,而不是创建 TXT 文件。

    【讨论】:

    • 我会分析这个选项,谢谢你的回答。如果我实施这种方法,我会在这里发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2015-02-28
    • 2012-08-16
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多