首页 > 解决方案 > 使用带范围的 GetObjectRequest 读取 AWS S3 GZIP 对象

问题描述

我正在尝试读取一个大的 AWS S3 压缩对象(gz)。我不想读取整个对象,想要部分读取它,以便我可以并行处理未压缩的数据我正在使用 GetObjectRequest 读取它“范围”标头,我在其中设置字节范围。但是,当我给出介于 (100,200) 之间的字节范围时,它会失败并显示“不是 GZIP 格式”失败的原因是,AWS 请求返回一个流,但是当我将其解析为 GZIPInputStream 时,它会失败,因为“GZIPInputStream”期望第一个字节 (GZIP_MAGIC = 0x8b1f) 确认它是 gzip ,它不存在于流中。

   GetObjectRequest rangeObjectRequest = new GetObjectRequest(<<Bucket>>, <<Key>>).withRange(100, 200);
   S3Object object = s3Client.getObject(rangeObjectRequest);
   S3ObjectInputStream rawData = object.getObjectContent();
   InputStream data =  new GZIPInputStream(rawData);

任何人都可以指导正确的方法吗?

标签: javaamazon-web-servicesamazon-s3gzipgzipstream

解决方案


GZIP 是一种压缩格式,其中文件中的每个字节都依赖于它之前的所有字节。这意味着您不能从文件中选择任意字节范围并理解它。

如果您需要读取字节范围,则需要将其存储为未压缩。

您还可以创建自己的文件存储格式,将文件块存储为单独压缩的块。您可以使用 ZIP 格式执行此操作,其中存档中的每个文件都代表一个特定的块大小。但是您需要实现自己的 ZIP 目录阅读器才能使其工作。


推荐阅读