java - 从 Amazon S3 分部分下载大文件

标签 java amazon-s3 inputstream

我想将大文件从 Amazon S3 下载到 RAM 中。文件大于 RAM 大小。看来我需要分部分加载它。每个部分都会在端点返回。 另外我不能使用硬盘来存储下载的文件。 我有 InputStream 对象,我正在尝试加载如下对象:

    inputStream.skip(totalBytes);
    long downloadedBytesCount = 0;
    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    do {
        length = inputStream.read(buffer);
        result.write(buffer, 0, length);
        downloadedBytesCount += length;
    }
    while (downloadedBytesCount <= partOfFileSize && (length != -1));
    totalBytes += downloadedBytesCount;

但是该代码存在问题:每个新请求都会从头开始下载文件,因此最后一个下载请求(例如 20 MB)将下载所有文件(例如 1 GB)。因此,方法 skip(long) 无法按我的预期工作。

如何从inputStream中分部分下载文件?有什么建议吗?

最佳答案

标准 S3 库可以传输您想要的文件的任何部分:

(取自 AWS docs )

GetObjectRequest rangeObjectRequest = new GetObjectRequest(
        bucketName, key);
rangeObjectRequest.setRange(0, 10); // retrieve 1st 11 bytes.
S3Object objectPortion = s3Client.getObject(rangeObjectRequest);

InputStream objectData = objectPortion.getObjectContent();

例如,在您的程序中,您可以通过移动范围一次读取 1000 个字节。

关于java - 从 Amazon S3 分部分下载大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46548984/

相关文章:

c# - 如何根据Request.InputStream判断调用了哪个WS方法?

java - 有没有可能知道一个HashSet中新增的符号?

java - 更改 ZK 中列的顺序

java - 如何 Autowiring 继承的Spring服务?

java - 为什么我不能将 null 字段与原始字段进行比较

amazon-web-services - Amazon S3 Select 的用例

amazon-web-services - Pyspark 数据帧从一个存储桶读取并在同一作业中使用不同的 KMS key 写入另一个存储桶

amazon-web-services - AWS 自动同步 : moving data from FTP server to S3

c++ - 输入流上的基于范围的循环

c++ - 将原始类型的值从标准输入读入变量