Search code examples
javaapache-commonsapache-commons-compress

Decompressing tar file with Apache Commons Compress


I'm using Apache Commons Compress to create tar archives and decompress them. My problems start with this method:

    private void decompressFile(File file) throws IOException {
    logger.info("Decompressing " + file.getName());

    BufferedOutputStream outputStream = null;
    TarArchiveInputStream tarInputStream = null;

    try {
        tarInputStream = new TarArchiveInputStream(
                new FileInputStream(file));

        TarArchiveEntry entry;
        while ((entry = tarInputStream.getNextTarEntry()) != null) {
            if (!entry.isDirectory()) {
                File compressedFile = entry.getFile();
                File tempFile = File.createTempFile(
                        compressedFile.getName(), "");

                byte[] buffer = new byte[BUFFER_MAX_SIZE];
                outputStream = new BufferedOutputStream(
                        new FileOutputStream(tempFile), BUFFER_MAX_SIZE);

                int count = 0;
                while ((count = tarInputStream.read(buffer, 0, BUFFER_MAX_SIZE)) != -1) {
                    outputStream.write(buffer, 0, count);
                }
            }

            deleteFile(file);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (outputStream != null) {
            outputStream.flush();
            outputStream.close();
        }
    }
}

Every time I run the code, compressedFile variable is null, but the while loop is iterating over all entries in my test tar.

Could you help me to understand what I'm doing wrong?


Solution

  • Try using getNextEntry() method instead of getNextTarEntry() method.

    The second method returns a TarArchiveEntry. Probably this is not what you want!