从s3读取时,GZIPInputStream过早关闭

时间:2015-07-07 17:42:14

标签: java amazon-s3 bufferedreader gzipinputstream

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

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

1 个答案:

答案 0 :(得分:0)

来自BufferedReader#readLine()的文档:

  

返回:

     

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

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

GZIP格式值得注意的怪癖:可以将多个文件相互附加,以创建包含多个gzip压缩对象的较大文件。似乎GZIPInputStream只能读取其中的第一个。

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

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