首页 > 解决方案 > Java 下载的文件缺少 183 个字节

问题描述

我正在尝试从 FTP 服务器下载并解压缩文件(即ftp://data.ndovloket.nl/netex/arr/NeTEx_ARR_NF_2021-03-01_1431.xml.gz)。手动下载此文件时,其大小正好为 6,492,629 字节。但是,当使用 Java 下载文件时,它的大小总是正好是 6,492,446 字节,所以每次似乎都缺少 183 字节。解压然后报错:

java.util.zip.ZipException:
在 java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:165)
在 java.base/java.util.zip.GZIPInputStream.read(GZIPInputStream. java:118)
在 java.base/java.io.FilterInputStream.read(FilterInputStream.java:107)
在 me.bys1.netexreader.Main.copyStream(Main.java:170)
在 me.bys1.netexreader.Main.downloadData (Main.java:164)
在 me.bys1.netexreader.Main.main(Main.java:123)

我正在使用以下代码:

    private static final void downloadData(final Data data, final File zip, final File file) throws IOException {
        final InputStream inZip = dataManager.getFile(data.path);
        final OutputStream outZip = new FileOutputStream(zip);
        
        copyStream(inZip, outZip);
        final InputStream in = new GZIPInputStream(new FileInputStream(zip));
        final OutputStream out = new FileOutputStream(file);
        copyStream(in, out); //line 146
    }
    
    private static final void copyStream(final InputStream in, final OutputStream out) throws IOException {
        /*final byte[] buffer = new byte[4096];
        int n;
        while ((n = in.read(buffer)) != -1) out.write(buffer, 0, n);
        in.close();
        out.close();*/ //other code I tried for copying streams, doesn't make any difference
        
        final ReadableByteChannel channelIn = Channels.newChannel(in);
        final WritableByteChannel channelOut = Channels.newChannel(out);
        final ByteBuffer buffer = ByteBuffer.allocate(1024);
        
        while (channelIn.read(buffer) != -1 || buffer.position() > 0) {
            buffer.flip();
            channelOut.write(buffer);
            buffer.compact();
        }
        
        channelIn.close();
        channelOut.close();
        in.close();
        out.close();
    }

为什么 Java 下载总是丢失相同数量的数据?并非所有文件都会发生这种情况(我尝试了一些运行良好的较小文件,而其他文件给出了不同的解压缩错误)。我怎样才能解决这个问题?

标签: javaiogzip

解决方案


推荐阅读