【问题标题】:Download big file by parts from Amazon S3从 Amazon S3 分部分下载大文件
【发布时间】:2018-03-14 21:50:26
【问题描述】:

我想将大文件从 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 下载文件?有什么建议吗?

【问题讨论】:

  • 据我所知,inputStream 不是为此而生的,因为它不能有多个来源。

标签: java amazon-s3 inputstream


【解决方案1】:

标准 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 个字节。

【讨论】:

    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 2018-01-09
    • 2015-04-19
    • 2015-12-07
    • 2020-05-29
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多