Java GZipInputStream ZLib 输入流意外结束
Java GZipInputStream unexpected end of ZLib input stream
作为参考,这是我得到的完整错误:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at com.genomedownloader.Main.FTPGet(Main.java:245)
at com.genomedownloader.Main.access0(Main.java:28)
at com.genomedownloader.Main.call(Main.java:494)
at com.genomedownloader.Main.call(Main.java:468)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:
我刚刚将我的程序从使用 FTP4J 作为 Java FTP 客户端切换到 Apache FTP 客户端。我调整了我的下载代码以便 Apache 可以工作,现在当我尝试解压缩程序下载的 *.gz 文件时出现此异常。
相关代码如下:
package com.test;
import org.apache.commons.net.ftp.FTPClient;
import java.io.*;
import java.util.zip.GZIPInputStream;
public class Main {
public static void main(String[] args) throws IOException {
FTPClient client;
client = new FTPClient();
client.connect("ftp.ncbi.nlm.nih.gov");
client.login("anonymous", "abc123");
client.setControlKeepAliveTimeout(300 * 60000);
client.changeWorkingDirectory("/genomes/all/GCF/000/334/875/GCF_000334875.1_ASM33487v1");
client.retrieveFile("GCF_000334875.1_ASM33487v1_genomic.fna.gz", new BufferedOutputStream(new FileOutputStream(new File(System.getProperty("user.dir") + "\GenomicFNA.gz"))));
GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(System.getProperty("user.dir") + "\GenomicFNA.gz"));
OutputStream out = new FileOutputStream(System.getProperty("user.dir") + "\GenomicFNA.fsa");
byte[] buf = new byte[1024];
int len;
while ((len = gzipInputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
gzipInputStream.close();
out.close();
client.logout();
client.disconnect();
}
}
尽管代码没有使用 Apache 和 FTP4j 库中的任何代码,但我终生无法弄清楚的是为什么代码与 FTP4J 一起工作但随后与 Apache 一起失败... 运行 上面的代码使用 Apache commons net,它应该可以工作。 (按照在顶部给出错误的方式工作)
将BufferedOutputStream改成单独声明,同样改变FileOutputStream,然后在GZip声明之前刷新并关闭它们。完成代码:
package com.test;
import org.apache.commons.net.ftp.FTPClient;
import java.io.*;
import java.util.zip.GZIPInputStream;
public class Main {
public static void main(String[] args) throws IOException {
BufferedOutputStream streamy;
FileOutputStream stream;
FTPClient client;
client = new FTPClient();
client.connect("ftp.ncbi.nlm.nih.gov");
client.login("anonymous", "abc123");
client.setControlKeepAliveTimeout(300 * 60000);
client.changeWorkingDirectory("/genomes/all/GCF/000/334/875/GCF_000334875.1_ASM33487v1");
client.retrieveFile("GCF_000334875.1_ASM33487v1_genomic.fna.gz", streamy = new BufferedOutputStream(stream = new FileOutputStream(new File(System.getProperty("user.dir") + "\GenomicFNA.gz"))));
stream.flush();
streamy.flush();
stream.close();
streamy.close();
client.logout();
client.disconnect();
GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(System.getProperty("user.dir") + "\GenomicFNA.gz"));
OutputStream out = new FileOutputStream(System.getProperty("user.dir") + "\GenomicFNA.fsa");
byte[] buf = new byte[1024];
int len;
while ((len = gzipInputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
gzipInputStream.close();
out.close();
}
}
作为参考,这是我得到的完整错误:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at com.genomedownloader.Main.FTPGet(Main.java:245)
at com.genomedownloader.Main.access0(Main.java:28)
at com.genomedownloader.Main.call(Main.java:494)
at com.genomedownloader.Main.call(Main.java:468)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:
我刚刚将我的程序从使用 FTP4J 作为 Java FTP 客户端切换到 Apache FTP 客户端。我调整了我的下载代码以便 Apache 可以工作,现在当我尝试解压缩程序下载的 *.gz 文件时出现此异常。 相关代码如下:
package com.test;
import org.apache.commons.net.ftp.FTPClient;
import java.io.*;
import java.util.zip.GZIPInputStream;
public class Main {
public static void main(String[] args) throws IOException {
FTPClient client;
client = new FTPClient();
client.connect("ftp.ncbi.nlm.nih.gov");
client.login("anonymous", "abc123");
client.setControlKeepAliveTimeout(300 * 60000);
client.changeWorkingDirectory("/genomes/all/GCF/000/334/875/GCF_000334875.1_ASM33487v1");
client.retrieveFile("GCF_000334875.1_ASM33487v1_genomic.fna.gz", new BufferedOutputStream(new FileOutputStream(new File(System.getProperty("user.dir") + "\GenomicFNA.gz"))));
GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(System.getProperty("user.dir") + "\GenomicFNA.gz"));
OutputStream out = new FileOutputStream(System.getProperty("user.dir") + "\GenomicFNA.fsa");
byte[] buf = new byte[1024];
int len;
while ((len = gzipInputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
gzipInputStream.close();
out.close();
client.logout();
client.disconnect();
}
}
尽管代码没有使用 Apache 和 FTP4j 库中的任何代码,但我终生无法弄清楚的是为什么代码与 FTP4J 一起工作但随后与 Apache 一起失败... 运行 上面的代码使用 Apache commons net,它应该可以工作。 (按照在顶部给出错误的方式工作)
将BufferedOutputStream改成单独声明,同样改变FileOutputStream,然后在GZip声明之前刷新并关闭它们。完成代码:
package com.test;
import org.apache.commons.net.ftp.FTPClient;
import java.io.*;
import java.util.zip.GZIPInputStream;
public class Main {
public static void main(String[] args) throws IOException {
BufferedOutputStream streamy;
FileOutputStream stream;
FTPClient client;
client = new FTPClient();
client.connect("ftp.ncbi.nlm.nih.gov");
client.login("anonymous", "abc123");
client.setControlKeepAliveTimeout(300 * 60000);
client.changeWorkingDirectory("/genomes/all/GCF/000/334/875/GCF_000334875.1_ASM33487v1");
client.retrieveFile("GCF_000334875.1_ASM33487v1_genomic.fna.gz", streamy = new BufferedOutputStream(stream = new FileOutputStream(new File(System.getProperty("user.dir") + "\GenomicFNA.gz"))));
stream.flush();
streamy.flush();
stream.close();
streamy.close();
client.logout();
client.disconnect();
GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(System.getProperty("user.dir") + "\GenomicFNA.gz"));
OutputStream out = new FileOutputStream(System.getProperty("user.dir") + "\GenomicFNA.fsa");
byte[] buf = new byte[1024];
int len;
while ((len = gzipInputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
gzipInputStream.close();
out.close();
}
}