2013-04-10 84 views
0

我正在嘗試使用java解壓壓縮.tar.gz文件,我得到的目錄錯誤似乎並不理解。請幫忙。我得到這個示例代碼從https://forums.oracle.com/forums/thread.jspa?threadID=2065236使用java錯誤解壓縮tar.gz

package untargz; 
import java.io.*; 
import com.ice.tar.*; 
import javax.activation.*; 
import java.util.zip.GZIPInputStream; 
/** 
* 
* @author stanleymungai 
*/ 
public class Untargz { 
public static InputStream getInputStream(String tarFileName) throws Exception{ 

     if(tarFileName.substring(tarFileName.lastIndexOf(".") + 1, tarFileName.lastIndexOf(".") + 3).equalsIgnoreCase("gz")){ 
     System.out.println("Creating an GZIPInputStream for the file"); 
     return new GZIPInputStream(new FileInputStream(new File(tarFileName))); 

     }else{ 
     System.out.println("Creating an InputStream for the file"); 
     return new FileInputStream(new File(tarFileName)); 
     } 
    } 

    private static void untar(InputStream in, String untarDir) throws IOException { 

     System.out.println("Reading TarInputStream... "); 
     TarInputStream tin = new TarInputStream(in); 
     TarEntry tarEntry = tin.getNextEntry(); 
     if(new File(untarDir).exists()){ 
      while (tarEntry != null){ 
      File destPath = new File(untarDir + File.separatorChar + tarEntry.getName()); 
      System.out.println("Processing " + destPath.getAbsoluteFile()); 
      if(!tarEntry.isDirectory()){ 
       FileOutputStream fout = new FileOutputStream(destPath); 
       tin.copyEntryContents(fout); 
       fout.close(); 
      }else{ 
       destPath.mkdir(); 
      } 
      tarEntry = tin.getNextEntry(); 
      } 
      tin.close(); 
     }else{ 
     System.out.println("That destination directory doesn't exist! " + untarDir); 
     }  
    } 
    private void run(){ 
     try {   
      String strSourceFile = "C:/AskulInstaller/pid.tar.gz"; 
      String strDest = "C:/AskulInstaller/Extracted Files"; 
      InputStream in = getInputStream(strSourceFile); 
      untar(in, strDest);  

     }catch(Exception e) { 

      e.printStackTrace();   
      System.out.println(e.getMessage()); 
     } 
    } 
    public static void main(String[] args) { 
     new Untargz().run(); 
    } 
} 

一旦我運行這段代碼,這是我的輸出;

Creating an GZIPInputStream for the file 
Reading TarInputStream... 
That destination directory doesn't exist! C:/AskulInstaller/Extracted Files 
BUILD SUCCESSFUL (total time: 0 seconds) 

當我手動創建目標目錄C:/ AskulInstaller /解壓縮文件

我得到這個錯誤輸出;

Creating an GZIPInputStream for the file 
Reading TarInputStream... 
Processing C:\AskulInstaller\Extracted Files\AskulInstaller\pid\Askul Logs\DbLayer_AskulMain_10_Apr_2013_07_44.log 
java.io.FileNotFoundException: C:\AskulInstaller\Extracted Files\AskulInstaller\pid\Askul Logs\DbLayer_AskulMain_10_Apr_2013_07_44.log (The system cannot find the path specified) 
C:\AskulInstaller\Extracted Files\AskulInstaller\pid\Askul Logs\DbLayer_AskulMain_10_Apr_2013_07_44.log (The system cannot find the path specified) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:165) 
    at untargz.Untargz.untar(Untargz.java:37) 
    at untargz.Untargz.run(Untargz.java:55) 
    at untargz.Untargz.main(Untargz.java:64) 

有沒有一種方法我應該把我的目錄,以便提取會發生什麼或我的錯誤是什麼?

回答

1

如果tar文件包含一個文件foo/bar.txt的條目,但不包含foo/那麼你的代碼將試圖創造一個不存在的目錄中的文件的先前的目錄條目。嘗試添加

destFile.getParentFile().mkdirs(); 

就在創建FileOutputStream之前。

或者,如果您不介意將代碼視Ant作爲庫,那麼您可以將整個解包過程委託給Ant任務,而不是手工完成。像這樣的東西(沒有完全測試):

Project p = new Project(); 
Untar ut = new Untar(); 
ut.setProject(p); 
ut.setSrc(tarFile); 
if(tarFile.getName().endsWith(".gz")) { 
    ut.setCompression((UntarCompressionMethod)EnumeratedAttribute.getInstance(UntarCompressionMethod.class, "gzip")); 
} 
ut.setDest(destDir); 

ut.perform(); 
+1

嘿老闆謝謝邁爾斯。有效! – ErrorNotFoundException 2013-04-10 07:42:37