new BufferedReader(new InputStreamReader(
new GZIPInputStream(s3Service.getObject(bucket, objectKey).getDataInputStream())))
创建Reader,如果file大于几MB,则在~100行之后从readLine()
返回null。
在小于1 MB的gzip文件上不可重现。
有谁知道如何处理这个问题?
答案 0 :(得分:0)
来自BufferedReader#readLine()
的文档:
返回:
包含该行内容的字符串,不包括任何行终止字符,如果已到达流末尾,则为null
我会很清楚地说明这意味着什么:遇到了文件/流的结尾 - 没有更多数据可用。
GZIP格式值得注意的怪癖:可以将多个文件相互附加,以创建包含多个gzip压缩对象的较大文件。似乎GZIPInputStream
只能读取其中的第一个。
这也解释了为什么它适用于"小文件"。那些只包含一个压缩对象,因此读取整个文件。
注意:如果GZIPInputStream
不正确地确定一个gzip文件已经结束,您可以在同一个GZIPInputStream
上打开另一个InputStream
并读取多个对象。