我想将大文件从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个字节。

10-06 10:44
查看更多