使用范围内的 GetObjectRequest 读取 AWS S3 GZIP Object

Read AWS S3 GZIP Object using GetObjectRequest with range

我正在尝试阅读一个大的 AWS S3 压缩 Object(gz)。我不想阅读整个 object,想部分阅读它,这样我可以并行处理未压缩的数据 我正在使用 GetObjectRequest with "Range" Header 读取它,我正在设置字节范围。 但是,当我给出介于 (100,200) 之间的字节范围时,它失败并显示 "Not in GZIP format" 失败的原因是,AWS 请求 return 一个流,但是当我将它解析为 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);

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

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

如果您需要读取字节范围,则需要以未压缩的方式存储它。

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