java - FTP下载的文件,解压时出错

标签 java linux ftp compression gzip

我正在从 FTP 服务器下载一些 .gz 文件并解压缩该文件以读取数据。我收到以下错误。

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 传输上传的?

最佳答案

尝试删除“BufferedOutputStream”

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

这应该足够了:

OutputStream local = new FileOutputStream(strCmnDwnldPath);

关于java - FTP下载的文件,解压时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073090/

相关文章:

java - 基本 JPA 问题 : "Could not determine type for: java.util.Set"

java - 有这方面的模式吗?对某些子类具有特殊操作的通用基类

java - Java 中静态方法的替代方法

c# - 使用 WCF 从远程 FTP 服务器下载和流式传输文件

Python通过ftp发送带有随机文件名的文件

java - 实体管理器中出现重复键错误,并保留正确的对象

java - linux 中的 update-alternatives 命令是什么,它有什么用?

c++ - gcov 检测共享对象引用 __gcov_init 隐藏符号

c# - 如何获取 IMemoryCache 中 key 的 AbsoluteExpiration DateTimeOffset

java - Java 中的 Apache FTP 服务器 : force CR LF to LF conversion for ASCII transfers