java - 使用带范围的 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);
任何人都可以指导正确的方法吗?
解决方案
GZIP 是一种压缩格式,其中文件中的每个字节都依赖于它之前的所有字节。这意味着您不能从文件中选择任意字节范围并理解它。
如果您需要读取字节范围,则需要将其存储为未压缩。
您还可以创建自己的文件存储格式,将文件块存储为单独压缩的块。您可以使用 ZIP 格式执行此操作,其中存档中的每个文件都代表一个特定的块大小。但是您需要实现自己的 ZIP 目录阅读器才能使其工作。
推荐阅读
- python - 直接从 Dash 中的回调返回一个图形
- javascript - 为传单多层控件添加不同的标题
- vue.js - 如何检查是否加载了 JSON 数据
- javascript - 使用正则表达式对 URL 进行 Trix 验证
- function - 如何从其他不同的工作簿工作表更新谷歌工作表中的工作簿工作表数据?
- angular - 如何将我的组件连接到我的 socket.io 服务器?
- ios - 如何在 Xcode 11 中旋转 ViewController?
- awk - Merge lines based on first column without delimiter
- awk - awk 模式匹配和处理缺失字段
- javascript - 从切换导航器(react-navigation v3)将获取响应对象从一个屏幕发送到另一个屏幕时遇到问题