Apache commons untar: IllegalArgumentException with getNextTarEntry
I am having a problem with the [compress apache library](http://commons.apache.org/compress). I would like to untar an archive that contains binary files. Here is the code:

<!-- language: java -->

	import java.io.BufferedInputStream;
	import java.io.BufferedOutputStream;
	import java.io.File;
	import java.io.FileInputStream;
	import java.io.FileOutputStream;
	import java.io.IOException;

	import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
	import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;

	public class ArchiveManager {
		
		public static final int BUFFER_MAX = 2048;

		public static void untar(String fileName, String targetPath) throws IOException {
			File tarArchiveFile = new File(fileName);
			BufferedOutputStream dest = null;
			FileInputStream tarArchiveStream = new FileInputStream(tarArchiveFile);
			TarArchiveInputStream tis = new TarArchiveInputStream(new BufferedInputStream(tarArchiveStream));
			TarArchiveEntry entry = null;
			try {
				while ((entry = tis.getNextTarEntry()) != null) {
					int count;
					File outputFile = new File(targetPath, entry.getName());

					if (entry.isDirectory()) { // entry is a directory
						if (!outputFile.exists()) {
							outputFile.mkdirs();
						}
					} else { // entry is a file
						byte[] data = new byte[BUFFER_MAX];
						FileOutputStream fos = new FileOutputStream(outputFile);
						dest = new BufferedOutputStream(fos, BUFFER_MAX);
						while ((count = tis.read(data, 0, BUFFER_MAX)) != -1) {
							dest.write(data, 0, count);
						}
						dest.flush();
						dest.close();
					}
				}
			} catch(Exception e) {
				e.printStackTrace();
			} finally {
				dest.flush();
				dest.close();
				tis.close();
			}
		}
	}

When untaring binary files, `getNextTarEntry()` throws an exception:

	java.lang.IllegalArgumentException: Invalid byte 111 at offset 0 in 'o.txt{NUL}{NUL}{NUL}' len=8
		at org.apache.commons.compress.archivers.tar.TarUtils.parseOctal(TarUtils.java:99)
		at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:786)
		at org.apache.commons.compress.archivers.tar.TarArchiveEntry.<init>(TarArchiveEntry.java:308)
		at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:198)
		at com.airbus.pakito.download.ArchiveManager.untar(ArchiveManager.java:22)

I tried to untar simple text files. After having untared the last file, `getNextTarEntry()` does not return null but an object with empty fileds. So `entry.getName()` is empty and obviously `new FileOutputStream(outputFile)` cannot create a file.

	java.io.FileNotFoundException: C:\Temp (Accès refusé)
		at java.io.FileOutputStream.open(Native Method)
		at java.io.FileOutputStream.<init>(Unknown Source)
		at java.io.FileOutputStream.<init>(Unknown Source)
		at com.airbus.pakito.util.Archive.untar(Archive.java:32)

Do you have an idea where the problem comes from?

Thanks.
Apache commons untar: IllegalArgumentException with getNextTarEntry
===

I am having a problem with the [compress apache library](http://commons.apache.org/compress). I would like to untar an archive that contains binary files. Here is the code:

<!-- language: java -->

	import java.io.BufferedInputStream;
	import java.io.BufferedOutputStream;
	import java.io.File;
	import java.io.FileInputStream;
	import java.io.FileOutputStream;
	import java.io.IOException;

	import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
	import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;

	public class ArchiveManager {
		
		public static final int BUFFER_MAX = 2048;

		public static void untar(String fileName, String targetPath) throws IOException {
			File tarArchiveFile = new File(fileName);
			BufferedOutputStream dest = null;
			FileInputStream tarArchiveStream = new FileInputStream(tarArchiveFile);
			TarArchiveInputStream tis = new TarArchiveInputStream(new BufferedInputStream(tarArchiveStream));
			TarArchiveEntry entry = null;
			try {
				while ((entry = tis.getNextTarEntry()) != null) {
					int count;
					File outputFile = new File(targetPath, entry.getName());

					if (entry.isDirectory()) { // entry is a directory
						if (!outputFile.exists()) {
							outputFile.mkdirs();
						}
					} else { // entry is a file
						byte[] data = new byte[BUFFER_MAX];
						FileOutputStream fos = new FileOutputStream(outputFile);
						dest = new BufferedOutputStream(fos, BUFFER_MAX);
						while ((count = tis.read(data, 0, BUFFER_MAX)) != -1) {
							dest.write(data, 0, count);
						}
						dest.flush();
						dest.close();
					}
				}
			} catch(Exception e) {
				e.printStackTrace();
			} finally {
				dest.flush();
				dest.close();
				tis.close();
			}
		}
	}

When untaring binary files, `getNextTarEntry()` throws an exception:

	java.lang.IllegalArgumentException: Invalid byte 111 at offset 0 in 'o.txt{NUL}{NUL}{NUL}' len=8
		at org.apache.commons.compress.archivers.tar.TarUtils.parseOctal(TarUtils.java:99)
		at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:786)
		at org.apache.commons.compress.archivers.tar.TarArchiveEntry.<init>(TarArchiveEntry.java:308)
		at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:198)
		at com.airbus.pakito.download.ArchiveManager.untar(ArchiveManager.java:22)

I tried to untar simple text files. After having untared the last file, `getNextTarEntry()` does not return null but an object with empty fileds. So `entry.getName()` is empty and obviously `new FileOutputStream(outputFile)` cannot create a file.

	java.io.FileNotFoundException: C:\Temp (Accès refusé)
		at java.io.FileOutputStream.open(Native Method)
		at java.io.FileOutputStream.<init>(Unknown Source)
		at java.io.FileOutputStream.<init>(Unknown Source)
		at com.airbus.pakito.util.Archive.untar(Archive.java:32)

Do you have an idea where the problem comes from?

Thanks.