java.io.EOFException: неожиданный конец входного потока ZLIB

Тестируя мой инструмент извлечения tar.gz, я обнаружил исключение:

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 sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at it.uniroma2.informatica.specialistica.IO.ScanCompressedFileUtil.main(ScanCompressedFileUtil.java:60

Итак, код в строке 60:

BufferedReader bufLe= reader.remove();
try {
  while ( bufLe.ready() ){
    System.out.println(" "+bufLe.readLine());
  }
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

где вызов buffer.readLine() вызывает исключение. Когда я открываю tar.gz, я сохраняю поток всех отдельных файлов, таких как BuffReader, затем помещаю их в связанный список, а затем закрываю буфер открытого файла tar.gz.

Но когда я вставляю элемент в связанный список, а затем пытаюсь читать построчно, у меня возникает исключение.

Почему у меня это исключение? Может быть, я что-то не так, когда перебираю файлы в tar.gz?

Для этого у меня есть код:

TarInputStream is =  new TarInputStream(gzipInputStream);

TarEntry entryx = null;

try {
  while((entryx = is.getNextEntry()) != null) {
    InputStream tmpInx = new StreamingTarEntry(is,  entryx.getSize());
    // questo viene invocato perchè il file da lettere è un file txt
    manageTxtinsideTAR(tmpInx , buffer);
    // I add the stream to a linked list

Класс STREAMINGTARENTRY расширяет FilterInputStream, поэтому он только оборачивает поток.


person Bomberlatinos9    schedule 27.02.2011    source источник
comment
Я не уверен, что это связано с вашей проблемой, но вы не должны использовать готовый метод BufferedReader таким образом. Прочтите его документацию по API. Чтобы прочитать все из BufferedReader, построчно, вызывайте readLine, пока он не вернет значение null.   -  person JB Nizet    schedule 27.02.2011
comment
Нет, извините. Проблема не связана с использованием .ready(). Потому что реализованы два типа приложений. НА моем первом приложении все работает хорошо. Но если мне нужен один файл, такой как BuffeREader, а затем я получаю один из них, у меня есть исключение.   -  person Bomberlatinos9    schedule 27.02.2011


Ответы (1)


Это может быть связано с ошибкой JVM http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=53ede10dc8803210b03577eac43?bug_id=6519463

См. мой ответ для получения более подробной информации по этому связанному вопросу https://stackoverflow.com/a/18845169/2463453

person Stephan L    schedule 17.09.2013
comment
+1. Если это проблема, решения заключаются либо в обновлении до более поздней версии Java 7, либо в отлове и игнорировании EOFException... в качестве обходного пути для ошибочного поведения JVM. - person Stephen C; 17.11.2013