2009-05-23 165 views
6

我有100個需要解壓縮的.gz文件。 我有幾個問題批量解壓縮.gz文件

a)我使用在http://www.roseindia.net/java/beginners/JavaUncompress.shtml給出的代碼來解壓縮.gz文件。它的工作正常。 任務: - 有沒有辦法獲得壓縮文件的文件名。我知道Java的Zip類給出了entery文件的枚舉。這可以給我存儲在.zip文件中的文件名,大小等。但是,我們的.gz文件是否一樣,或者文件名是否與除去.gz的filename.gz相同。

b)是否有另一種優雅的方式來通過調用java代碼中的效用函數來解壓縮.gz文件。就像從你的java類調用7-zip應用程序一樣。然後,我不必擔心輸入/輸出流。

在此先感謝。 Kapil

回答

9

一)Zip是一個壓縮文件格式,而gzip的不是。因此,除非(例如)你的gz文件是壓縮的tar文件,否則一個條目迭代器沒什麼意義。你想要的可能是:

File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 

b)你只想解壓文件嗎?如果不是,您可以使用GZIPInputStream並直接讀取文件,即不需要中間解壓縮。

但是好的。假設你真的只有想要解壓縮文件。如果是的話,你很可能在此:

public static File unGzip(File infile, boolean deleteGzipfileOnSuccess) throws IOException { 
    GZIPInputStream gin = new GZIPInputStream(new FileInputStream(infile)); 
    FileOutputStream fos = null; 
    try { 
     File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 
     fos = new FileOutputStream(outFile); 
     byte[] buf = new byte[100000]; 
     int len; 
     while ((len = gin.read(buf)) > 0) { 
      fos.write(buf, 0, len); 
     } 

     fos.close(); 
     if (deleteGzipfileOnSuccess) { 
      infile.delete(); 
     } 
     return outFile; 
    } finally { 
     if (gin != null) { 
      gin.close();  
     } 
     if (fos != null) { 
      fos.close();  
     } 
    }  
} 
+0

嗨,我可以讀取文件,而不需要解析。我想要像逐行閱讀一樣。 而且,這些文件的長度/行不能只有80個字符。 BufferedReader是我用過的工具。但是,它沒有GzInputStream的構造函數。 – 2009-06-14 21:16:05

2

關於A,gunzip命令創建一個未壓縮文件,其原始名稱減去.gz後綴。請參閱man page

關於B,你需要專門的gunzip,還是會另外的壓縮算法呢? 7zip使用的LZMA壓縮算法的java port創建.7z文件,但它不會處理.gz文件。

0

如果您有一個固定數量的文件解壓縮一次,爲什麼不使用現有的工具呢? 正如保羅·莫爾注意到,gunzip可以這樣做: for i in *.gz; do gunzip $i; done ,且將自動爲它們命名,剝離.gz$

在Windows上,嘗試用Winrar,很可能或gunziphttp://unxutils.sf.net

0

的GZip通常只在單用文件,所以它一般不包含有關單個文件的信息。要將多個文件捆綁到一個壓縮存檔中,首先將它們組合成一個未壓縮的Tar文件(包含有關單個內容的信息),然後將其壓縮爲單個文件。這種組合稱爲Tarball。

有一些庫可以從Tar中提取單個文件信息,就像使用ZipEntries一樣。 One example.您首先必須將.gz文件解壓縮到臨時文件中才能使用它,或者至少將GZipInputStream提供給Tar庫。

您也可以使用Java從命令行調用7-Zip。 7-Zip命令行語法如下:7-Zip Command Line Syntax.從Java調用命令shell的示例:Executing shell commands in Java.您將不得不調用7-Zip兩次:一次從.tar.gz或.tgz文件中提取Tar,然後再次從Tar中提取單個文件。或者,你可以做簡單的事情,並寫一個簡短的shell腳本或批處理文件來做你的解壓縮。沒有理由在圓孔中錘擊一個方形釘 - 這是批處理文件的作用。作爲獎勵,您還可以爲它們提供參數,從而大大降低java命令行執行的複雜度,同時仍然允許java控制執行。

0

你試過

gunzip *.gz 
0

的.gz文件(gzip壓縮)可以存儲壓縮文件的文件名。因此,例如FuBar.doc可以保存在myDocument.gz中,並且通過適當的解壓縮,該文件可以恢復爲文件名FuBar.doc。不幸的是,java.util.zip.GZIPInputStream不支持讀取文件名的任何方式,即使它存儲在歸檔中。