Note that there are some explanatory texts on larger screens.

plurals
  1. POApache commons untar: IllegalArgumentException with getNextTarEntry
    text
    copied!<p>I am having a problem with the <a href="http://commons.apache.org/compress" rel="nofollow">compress apache library</a>. I would like to untar an archive that contains binary files. Here is the code:</p> <pre class="lang-java prettyprint-override"><code>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 { if (dest != null) { dest.flush(); dest.close(); } tis.close(); } } } </code></pre> <p>When untaring binary files, <code>getNextTarEntry()</code> throws an exception:</p> <pre><code>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.&lt;init&gt;(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) </code></pre> <p>I tried to untar simple text files. After having untared the last file, <code>getNextTarEntry()</code> does not return null but an object with empty fileds. So <code>entry.getName()</code> is empty and obviously <code>new FileOutputStream(outputFile)</code> cannot create a file.</p> <pre><code>java.io.FileNotFoundException: C:\Temp (Accès refusé) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.&lt;init&gt;(Unknown Source) at java.io.FileOutputStream.&lt;init&gt;(Unknown Source) at com.airbus.pakito.util.Archive.untar(Archive.java:32) </code></pre> <p>Do you have an idea where the problem comes from?</p> <p>Thanks.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload