How to print the content of a tar.gz file with Jav

2019-04-13 11:07发布

问题:

I have to implement an application that permits printing the content of all files within a tar.gz file.

For Example:
if I have three files like this in a folder called testx:
A.txt contains the words "God Save The queen"
B.txt contains the words "Ubi maior, minor cessat"
C.txt.gz is a file compressed with gzip that contain the file c.txt with the words "Hello America!!"

So I compress testx, obtain the compressed tar file: testx.tar.gz.

So with my Java application I would like to print in the console:
"God Save The queen"
"Ubi maior, minor cessat"
"Hello America!!"

I have implemented the ZIP version and it works well, but keeping tar library from apache ant http://commons.apache.org/compress/, I noticed that it is not easy like ZIP java utils.

Could someone help me?

I have started looking on the net to understand how to accomplish my aim, so I have the following code:

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!! 
        }
    }
}

So in the line is.copyEntryContents(out), it is possible to save on a file the stream passing an OutputStream, but I don't want it! In the zip version after keeping the first entry, ZipEntry, we can extract the stream from the compressed root folder, testx.tar.gz, and then create a new ZipInputStream and play with it to obtain the content.

Is it possible to do this with the tar.gz file?

Thanks.

回答1:

surfing the net, i have encountered an interesting idea at : http://hype-free.blogspot.com/2009/10/using-tarinputstream-from-java.html.

After converting ours TarEntry to Stream, we can adopt the same idea used with Zip Files like:

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 with this code you could print the content of the file testx.tar.gz ^_^



回答2:

To not have to write to a File you should use a ByteArrayOutputStream and use the public String toString(String charsetName) with the correct encoding.