从 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
并读取多个对象。
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
并读取多个对象。