new BufferedReader(new InputStreamReader(
new GZIPInputStream(s3Service.getObject(bucket, objectKey).getDataInputStream())))
readLine()
如果文件大于几 MB,则创建从 ~100 行之后返回 null 的 Reader 。在小于 1 MB 的 gzip 文件上无法重现。有谁知道如何处理这个?
new BufferedReader(new InputStreamReader(
new GZIPInputStream(s3Service.getObject(bucket, objectKey).getDataInputStream())))
readLine()
如果文件大于几 MB,则创建从 ~100 行之后返回 null 的 Reader 。在小于 1 MB 的 gzip 文件上无法重现。有谁知道如何处理这个?
从以下文档BufferedReader#readLine()
:
回报:
包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则为 null
我会说很清楚这意味着什么:文件/流的结尾已经遇到 - 没有更多数据可用。
GZIP 格式的显着怪癖:多个文件可以彼此附加,以创建一个包含多个 gzip 压缩对象的更大文件。似乎GZIPInputStream
唯一读取了其中的第一个。
这也解释了为什么它适用于“小文件”。这些仅包含一个压缩对象,因此会读取整个文件。
注意:如果非破坏性地GZIPInputStream
确定一个 gzip 文件已经结束,您可以GZIPInputStream
在同一个文件上打开另一个InputStream
并读取多个对象。