Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception: Unexpected end of ZLIB input stream

Tags:

There is something wrong with GZIPInputStream or GZIPOutputStream. Just please read the following code (or run it and see what happens):

def main(a: Array[String]) {     val name = "test.dat"     new GZIPOutputStream(new FileOutputStream(name)).write(10)     println(new GZIPInputStream(new FileInputStream(name)).read()) } 

It creates a file test.dat, writes a single byte 10 formatting by GZIP, and read the byte in the same file with the same format.

And this is what I got running it:

Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream     at java.util.zip.InflaterInputStream.fill(Unknown Source)     at java.util.zip.InflaterInputStream.read(Unknown Source)     at java.util.zip.GZIPInputStream.read(Unknown Source)     at java.util.zip.InflaterInputStream.read(Unknown Source)     at nbt.Test$.main(Test.scala:13)     at nbt.Test.main(Test.scala) 

The reading line seems going the wrong way for some reason.

I googled the error Unexpected end of ZLIB input stream and found some bug reports to Oracle, which were issued around 2007-2010. So I guess the bug still remains in some way, but I'm not sure if my code is right, so let me post this here and listen to your advice. Thank you!

like image 251
Ryoichiro Oka Avatar asked Jul 02 '14 12:07

Ryoichiro Oka


People also ask

How do I fix unexpected end of zlib input stream?

Resolving The Problem Please delete the corrupted original and use the previous backup stream. If you have a specific stream that causes this when you attempt to reload it, and the save within Modeler appears to complete (ie.

How do I use GZIPInputStream?

To use the Java GZIPInputStream you must first create a GZIPInputStream instance. Here is an example of creating a GZIPInputStream instance: InputStream fileInputStream = new FileInputStream("myfile. zip"); GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream);


1 Answers

You have to call close() on the GZIPOutputStream before you attempt to read it. The final bytes of the file will only be written when the stream object is actually closed.

(This is irrespective of any explicit buffering in the output stack. The stream only knows to compress and write the last bytes when you tell it to close. A flush() won't help ... though calling finish() instead of close() should work. Look at the javadocs.)

Here's the correct code (in Java);

package test;  import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream;  public class GZipTest {      public static void main(String[] args) throws                 FileNotFoundException, IOException {         String name = "/tmp/test";         GZIPOutputStream gz = new GZIPOutputStream(new FileOutputStream(name));         gz.write(10);         gz.close();       // Remove this to reproduce the reported bug         System.out.println(new GZIPInputStream(new FileInputStream(name)).read());     } } 

(I've not implemented resource management or exception handling / reporting properly as they are not relevant to the purpose of this code. Don't treat this as an example of "good code".)

like image 185
Stephen C Avatar answered Oct 14 '22 03:10

Stephen C