【问题标题】:Reading N bytes from AWS s3 file does not read N bytes从 AWS s3 文件中读取 N 个字节不会读取 N 个字节
【发布时间】:2020-06-12 18:20:15
【问题描述】:

我正在尝试从 AWS S3 存储桶中的文件中读取 N 个字节并将其写入缓冲区,但是当我尝试这样做时,返回的字节数不是 N,而是要少得多,并且在多次调用后它会有所不同.

我正在做的是:

public int readData(byte[] data, int doff, long offset, int length, String bucketName, String fileName) throws IOException {
    GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, fileName)
            .withRange(offset, length);

    S3Object objectPortion = S3_CLIENT.getObject(rangeObjectRequest);

    return objectPortion.getObjectContent().read(data, doff, length);
}

offset = 0length = 32752

objectPortion.getObjectContent().read(data, doff, length);

返回16360data 大小为 32820,足以满足我想要的所有数据。

为什么会这样?为什么不返回所有数据?

我要下载的文件大小约为 69kb

【问题讨论】:

  • InputStream.read() 不像您认为的那样工作:“尝试读取多达 len 个字节,但可能会读取较小的字节数”。需要循环阅读,在本站会发现很多类似的问题。
  • 反复调用read(),将返回的数据累加,直到返回值-1,表示流结束。

标签: java amazon-web-services amazon-s3 aws-java-sdk


【解决方案1】:

使用这个 sn-p 读取全部内容:

try (S3ObjectInputStream is = objectPortion.getObjectContent()) {
    byte[] buf = new byte[4096];
    int read = 0;

    while ((read = is.read(buf)) >= 0) {
        // use buf / read values
    }
} catch (Exception e) {
    …
}

【讨论】:

  • 我做了一些类似的事情,但我发现这会导致无限循环,由于某种原因 .read() 在读取所有内容后导致 0 并且您没有读取文件的最后部分。所以需要做一些检查。
猜你喜欢
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2015-05-09
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多