Исключение: Неожиданный конец входного потока ZLIB
Что-то не так с GZIPInputStream
или GZIPOutputStream
. Просто прочитайте следующий код (или запустите его и посмотрите, что произойдет):
def main(a: Array[String]) {
val name = "test.dat"
new GZIPOutputStream(new FileOutputStream(name)).write(10)
println(new GZIPInputStream(new FileInputStream(name)).read())
}
Создает файл test.dat
, записывает однобайтное 10
форматирование по GZIP и считывает байт в том же файле в том же формате.
И вот что я получил от него:
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)
По какой-то причине линия чтения кажется неправильной.
Я искал ошибку Unexpected end of ZLIB input stream
и нашел некоторые отчеты об ошибках для Oracle, выпущенные в 2007-2010 годах. Таким образом, я думаю, ошибка все еще остается в некотором роде, но я не уверен, что мой код прав, поэтому позвольте мне опубликовать это здесь и послушать ваши советы. Спасибо!
Ответы
Ответ 1
Вы должны вызвать close()
на GZIPOutputStream
, прежде чем пытаться его прочитать. Окончательные байты файла будут записываться только тогда, когда файл фактически закрыт. (Это независимо от какой-либо явной буферизации в стеке вывода. Поток знает только, чтобы сжимать и записывать последние байты, когда вы приказываете закрыть его. flush()
, вероятно, не поможет... хотя вызов finish()
вместо close()
должен работать. Посмотрите на javadocs.)
Здесь правильный код (в 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();
System.out.println(new GZIPInputStream(new FileInputStream(name)).read());
}
}
(Я не правильно использовал управление ресурсами. Не рассматривайте это как пример "хорошего кода".)