2012-03-09 64 views
1

我遇到compress apache library問題。我想解壓包含二進制文件的存檔。下面是代碼:Apache commons untar:IllegalArgumentException與getNextTarEntry

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(); 
     } 
    } 
} 

當untaring二進制文件,getNextTarEntry()拋出一個異常:

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) 

我試圖解壓簡單的文本文件。在將最後一個文件解壓後,getNextTarEntry()不會返回null,而是返回空文件的對象。所以entry.getName()是空的,顯然new FileOutputStream(outputFile)不能創建文件。

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) 

您是否知道問題的來源?

謝謝。

回答