从 s3 读取时 GZIPInputStream 过早关闭

GZIPInputStream is prematurely closed when reading from s3

new BufferedReader(new InputStreamReader(
       new GZIPInputStream(s3Service.getObject(bucket, objectKey).getDataInputStream())))
如果文件大于数 MB,

在约 100 行后从 readLine() 创建 Reader returns null。 在小于 1 MB 的 gzip 文件上不可重现。 有人知道如何处理吗?

来自 BufferedReader#readLine() 的文档:

Returns:

A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached

我会说得很清楚这意味着什么:已遇到 file/stream 的末尾 - 没有更多数据可用。

GZIP 格式的显着怪癖:多个文件可以相互附加以创建包含多个 gzip 对象的更大文件。 GZIPInputStream 似乎只读了其中的第一个。

这也解释了为什么它适用于 "small files"。那些只包含一个压缩对象,因此读取整个文件。

注意:如果 GZIPInputStream 非破坏性地确定一个 gzip 文件已结束,您可以在同一个 InputStream 上打开另一个 GZIPInputStream 并读取多个对象。