Java 从s3读取时,GZIPInputStream过早关闭
如果文件大于几MB,则在~100行之后创建从Java 从s3读取时,GZIPInputStream过早关闭,java,amazon-s3,bufferedreader,gzipinputstream,Java,Amazon S3,Bufferedreader,Gzipinputstream,如果文件大于几MB,则在~100行之后创建从readLine()返回null的读取器。 在小于1 MB的gzip文件上不可复制。 有人知道如何处理这个问题吗?来自BufferedReader\readLine()的文档: 返回: 一个包含行内容的字符串,不包括任何行终止字符,,如果已到达流的结尾,则为null 我想说的很清楚这意味着什么:遇到了文件/流的结尾-没有更多的数据可用 GZIP格式的显著特点是:多个文件可以相互追加,以创建包含多个GZIP对象的更大文件。似乎gzip输入流只读取其中的第
readLine()
返回null的读取器。
在小于1 MB的gzip文件上不可复制。
有人知道如何处理这个问题吗?来自
BufferedReader\readLine()
的文档:
返回:
一个包含行内容的字符串,不包括任何行终止字符,,如果已到达流的结尾,则为null
我想说的很清楚这意味着什么:遇到了文件/流的结尾-没有更多的数据可用
GZIP格式的显著特点是:多个文件可以相互追加,以创建包含多个GZIP对象的更大文件。似乎gzip输入流
只读取其中的第一个
这也解释了为什么它适用于“小文件”。这些文件只包含一个压缩对象,因此读取整个文件
注意:如果
gzip输入流
以非破坏性方式确定一个gzip文件已结束,则可以在同一InputStream
上打开另一个gzip输入流
,并读取多个对象。来自BufferedReader#readLine()
的文档:
返回:
一个包含行内容的字符串,不包括任何行终止字符,,如果已到达流的结尾,则为null
我想说的很清楚这意味着什么:遇到了文件/流的结尾-没有更多的数据可用
GZIP格式的显著特点是:多个文件可以相互追加,以创建包含多个GZIP对象的更大文件。似乎gzip输入流
只读取其中的第一个
这也解释了为什么它适用于“小文件”。这些文件只包含一个压缩对象,因此读取整个文件
注意:如果
gzip输入流
以非破坏性方式确定一个gzip文件已结束,则可以在同一InputStream
上打开另一个gzip输入流
,并读取多个对象。Hi worldssender。在我看来,这个问题对你们来说并不清楚。请仔细阅读“如果文件大于几MB,请在大约100行之后”。这不是文件的结尾。大约有7000条线路。谢谢@Denys,你在读s3Service.getObject(bucket,objectKey)你怎么知道大约有7000行?顺便说一句,行并不重要,我们讨论的是二进制数据。你能看到你是否准确地阅读了s3Service.getObject(bucket,objectKey).getObjectMetadata().getContentLength()
bytes吗?我知道这一点,因为我是手动提取gzip的。现在我正在处理最新版本的Jet3T。我找到了根案例。gzip文件是在附加模式下生成的,GZIPOutputStream可能不支持这种模式。谢谢每一个试图帮助你的人!不幸的是,由于某些原因,我无法将此作为我问题的答案。@Denys,我在答案中添加了一句话。我想这就是你想说的?你好。在我看来,这个问题对你们来说并不清楚。请仔细阅读“如果文件大于几MB,请在大约100行之后”。这不是文件的结尾。大约有7000条线路。谢谢@Denys,你在读s3Service.getObject(bucket,objectKey)你怎么知道大约有7000行?顺便说一句,行并不重要,我们讨论的是二进制数据。你能看到你是否准确地阅读了s3Service.getObject(bucket,objectKey).getObjectMetadata().getContentLength()
bytes吗?我知道这一点,因为我是手动提取gzip的。现在我正在处理最新版本的Jet3T。我找到了根案例。gzip文件是在附加模式下生成的,GZIPOutputStream可能不支持这种模式。谢谢每一个试图帮助你的人!不幸的是,由于某些原因,我无法将此作为我问题的答案。@Denys,我在答案中添加了一句话。我想这就是你的意思吧?
new BufferedReader(new InputStreamReader(
new GZIPInputStream(s3Service.getObject(bucket, objectKey).getDataInputStream())))