2015-08-18 61 views
0

我正在從FTP服務器下載幾個.gz文件,並解壓縮文件以讀取數據。我收到以下錯誤。FTP下載的文件,解壓時出錯

java.io.IOException: Corrupt GZIP trailer 
     at java.util.zip.GZIPInputStream.readTrailer(GZIPInputStream.java:200) 
     at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:92) 
     at java.io.FilterInputStream.read(FilterInputStream.java:90) 
     at com.omnesys.xdk.ClsXDKRTWeb.UnGunZip(ClsXDKRTWeb.java:961) 
     at com.omnesys.xdk.ClsXDKRTWeb.DeCompress(ClsXDKRTWeb.java:857) 
     at com.omnesys.xdk.ClsXDKRTWeb.FTPDownloadProcess(ClsXDKRTWeb.java:629) 
     at com.omnesys.xdk.ClsXDKRTWeb.ProcessRequestXML(ClsXDKRTWeb.java:460) 
     at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptorFactory.java:72) 

fTP下載和解壓縮的代碼如下。

FTPClient ftp; 
    FTPClientConfig config; 
    ftp = new FTPClient(); 
    config = new FTPClientConfig(); 
    ftp.configure(config); 
    ftp.connect(strFTPServername); 

    ftp.user(strFTPUserName); 
    ftp.pass(strFTPUserPwd); 
    ftp.setFileType(FTP.BINARY_FILE_TYPE); 
    OutputStream local = new BufferedOutputStream(new FileOutputStream(strCmnDwnldPath)); 
    ftp.retrieveFile(strSrcFilePath, local); 
    local.close(); 
    if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { 
     ftp.disconnect(); 
     return false; 
    } else { 
     ftp.logout() 
    } 


    private boolean UnGunZip(String filename, String outputFolder) { 
     byte[] buffer = new byte[1024]; 
     try { 
      String sfilename = new File(filename).getName(); 
      sfilename = sfilename.substring(0, sfilename.indexOf(".gz")); 
      FileInputStream fileIn = new FileInputStream(filename); 
      GZIPInputStream gZIPInputStream = new GZIPInputStream(fileIn); 
      FileOutputStream fileOutputStream = new FileOutputStream(outputFolder + File.separator + sfilename); 
      int count; 
      while ((count = gZIPInputStream.read(buffer)) > 0) { 
       fileOutputStream.write(buffer, 0, count); 
      } 
      gZIPInputStream.close(); 
      fileOutputStream.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 

我的應用程序在Linux環境下運行。當我嘗試在Windows環境中提取文件時,出現錯誤,指出文件已損壞。

當我嘗試從Windows環境下載相同的文件時,我不會遇到此問題。

有人可以幫我解決這個問題。

[編輯:]我發現this的問題,根據這個文件應該上傳爲ASCII並下載爲ASCII。但是,如何查找文件是否使用ASCII傳輸上傳?

+0

你可以試試這個:http://stackoverflow.com/a/19457947/1129313? – Garry

+0

@Garry我試過了,但它沒有解決這個問題。 – Ace

回答

0

嘗試刪除 「的BufferedOutputStream」

OutputStream local = new BufferedOutputStream(new FileOutputStream(strCmnDwnldPath)); 

這應該是足夠了:

OutputStream local = new FileOutputStream(strCmnDwnldPath); 
+1

你認爲這是一個答案,並會解決問題嗎? – Garry

+0

我還沒有在兩種環境(linux和windows)上嘗試過它,但它應該修復它。 BufferedOutputStream可能會將一些「\ n」補充爲「\ n \ r」,反之亦然。在二進制文件中是非常重要的。 – ozma

+0

@ozma問題依然存在。 – Ace