java - 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 下载总是丢失相同数量的数据?并非所有文件都会发生这种情况(我尝试了一些运行良好的较小文件,而其他文件给出了不同的解压缩错误)。我怎样才能解决这个问题?
解决方案
推荐阅读
- html - 提交Angular JS后如何关闭表单
- nativescript - 使用 Nativescript Sidekick 为 iOS 构建云会导致 CODE_SIGN_ENTITLEMENTS 错误
- javascript - MVC 检查电子邮件是否已存在或未使用 Ajax
- android - 将捕获的图像或从画廊传递到另一个活动
- assembly - 为什么 make add rm 命令我没有指定?
- graph-databases - memgraphdb:支持图形数据库中的时间旅行查询
- aem - 无法在 WCMPojo 中获取隐式对象
- java - 如何将 LocalDate 列表写入 java 中的文件?
- require - 如何在 Mathjax 中定义和使用宏?
- python - 模型中的额外 ID