1
new BufferedReader(new InputStreamReader(
       new GZIPInputStream(s3Service.getObject(bucket, objectKey).getDataInputStream())))

readLine()如果文件大于几 MB,则创建从 ~100 行之后返回 null 的 Reader 。在小于 1 MB 的 gzip 文件上无法重现。有谁知道如何处理这个?

4

1 回答 1

0

从以下文档BufferedReader#readLine()

回报:

包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则为 null

我会说很清楚这意味着什么:文件/流的结尾已经遇到 - 没有更多数据可用。

GZIP 格式的显着怪癖:多个文件可以彼此附加,以创建一个包含多个 gzip 压缩对象的更大文件。似乎GZIPInputStream唯一读取了其中的第一个。

这也解释了为什么它适用于“小文件”。这些仅包含一个压缩对象,因此会读取整个文件。

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

于 2015-07-07T17:52:41.833 回答