Как распечатать содержимое файла tar.gz с помощью Java?

Мне нужно реализовать приложение, которое позволяет печатать содержимое всех файлов в файле tar.gz.

Например:
если у меня есть три таких файла в папке с именем testx:
A.txt содержит слова "Боже, храни королеву"
B.txt содержит слова "Ubi maior, minor cessat"
C.txt.gz — это файл, сжатый с помощью gzip, который содержит файл c.txt со словами «Привет, Америка!!»

Итак, я сжимаю testx, получаю сжатый файл tar: testx.tar.gz.

Итак, с моим Java-приложением я хотел бы напечатать в консоли:
"Боже, храни королеву"
"Ubi maior, minor cessat"
"Привет, Америка!!"

Я реализовал ZIP-версию, и она работает хорошо, но сохранила библиотеку tar от apache и http://commons.apache.org/compress/, я заметил, что это не так просто, как ZIP java utils.

Может ли кто-нибудь помочь мне?

Я начал искать в сети, чтобы понять, как достичь своей цели, поэтому у меня есть следующий код:

GZIPInputStream gzipInputStream=null;
gzipInputStream = new GZIPInputStream( new FileInputStream(fileName));
TarInputStream is =  new TarInputStream(gzipInputStream);
TarEntry entryx = null;

while((entryx = is.getNextEntry()) != null) {
    if (entryx.isDirectory()) continue;
    else {
        System.out.println(entryx.getName());
        if ( entryx.getName().endsWith("txt.gz")){
            is.copyEntryContents(out);
            // out is a OutputStream!! 
        }
    }
}

Итак, в строке is.copyEntryContents(out) можно сохранить в файл поток, проходящий через OutputStream, но я этого не хочу! В zip-версии после сохранения первой записи ZipEntry мы можем извлечь поток из сжатой корневой папки testx.tar.gz, а затем создать новый ZipInputStream и поиграть с ним, чтобы получить содержимое.

Можно ли это сделать с файлом tar.gz?

Спасибо.


person Bomberlatinos9    schedule 23.02.2011    source источник


Ответы (2)


бродя по сети, я наткнулся на интересную идею по адресу: http://hype-free.blogspot.com/2009/10/using-tarinputstream-from-java.html.

После преобразования нашего TarEntry в Stream мы можем использовать ту же идею, что и с Zip-файлами, например:

InputStream tmpIn = new StreamingTarEntry(is,  entryx.getSize());
// use BufferedReader to get one line at a time
BufferedReader gzipReader = new BufferedReader(
                       new InputStreamReader(
                        new GZIPInputStream(
                        inputZip )));

while (gzipReader.ready()) { System.out.println(gzipReader.readLine()); }
gzipReader.close();

SO с помощью этого кода вы можете распечатать содержимое файла testx.tar.gz ^_^

person Bomberlatinos9    schedule 23.02.2011

Чтобы не писать в File, вы должны использовать ByteArrayOutputStream. и используйте public String toString(String charsetName) с правильной кодировкой.

person Community    schedule 23.02.2011