Возможно ли хранить содержимое всех файлов внутри сжатого tar.gz, как поток? - PullRequest
2 голосов
/ 28 февраля 2011

У меня есть проблема, чтобы решить. У меня есть сжатый файл tar.gz, и я хотел бы сохранить содержимое как поток, как позволяет Zipfile с помощью метода zipFile.getInputStream (zipEntry). Я реализовал с помощью библиотеки Ant, код:

TarInputStream is =  new TarInputStream(gzipInputStream);
while((entryx = is.getNextEntry()) != null) {
    if (entryx.isDirectory()) continue;
    else {
              InputStream tmpIn = new StreamingTarEntry(is,  entryx.getSize());
              BufferedReader gzipReader = null;</p>

<code>     // simple loop to dump the contents to the console
    try {
        gzipReader = new BufferedReader(
               new InputStreamReader(
                new GZIPInputStream(
                 tmpIn)));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    if (gzipReader !=null){
        buffer.add(gzipReader);

    }

    }// end of while
  is.close();
</code>

После того, как я поместил BUFFERreader в свой связанный список, а затем извлек его в главном и хочет напечатать содержимое буфера, у меня есть исключение: java.io.EOFException: неожиданный конец входного потока ZLIB в java.util.zip.InflaterInputStream.fill (Неизвестный источник)

Кто может мне помочь ???

Ответы [ 3 ]

1 голос
/ 28 февраля 2011

Возможно, это связано с очень давней ошибкой - см. здесь

1 голос
/ 28 февраля 2011

Я полагаю, что вы внедрили StreamingTarEntry самостоятельно, поскольку в Google нет других ссылок, и это не является частью Ant API.Из вашего другого вопроса, я думаю, вы следили за этим сообщением в блоге .Если исходный код не указан StreamingTarEntry, то этот ответ частично является догадкой.

* * * * * * * * * * *. В Ant можно только читать данные из текущей записи tar.Вы не можете сохранить ссылку на позицию в файле tar и вернуться к ней, но вместо этого должны обрабатывать каждый файл по мере его достижения.Ваш класс StreamingTarEntry должен скопировать все данные из текущей записи во временное место в памяти или на диске, прежде чем он вызовет getNextEntry() или close() на TarInputStream.

1 голос
/ 28 февраля 2011

Из того, что я помню - в tar.gz сжатие выполняется последним - я не знаком с классом TarInputStream, но я предполагаю, что он будет работать что-то вроде

InputStream in = new FileInputStream("myFile");
GZIPInputStream gzipIn = new GZIPInputStream(in);
TarInputStream tarIn=  new TarInputStream(gzipIn );
while((entryx = is.getNextEntry()) != null) {
    if (entryx.isDirectory()) continue;
    else {
          InputStream dataIn = new StreamingTarEntry(is,  entryx.getSize());
          //Process your data here - it is already uncompressed
    }
}

т.е.: tar.gzip - это архив tar, который был распакован

...