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!
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.
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);
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".)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With