公開の匿名 FTP からファイルを読み込もうとしていますが、問題が発生しています。プレーン テキスト ファイルは問題なく読み取ることができますが、gzip ファイルを読み取ろうとすると、次の例外が発生します。
Exception in thread "main" java.util.zip.ZipException: invalid distance too far back
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:116)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at java_io_FilterInputStream$read.call(Unknown Source)
at GenBankFilePoc.main(GenBankFilePoc.groovy:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
ファイルをダウンロードしてFileInputStream
ラップされたを使用してみましたGZIPInputStream
が、まったく同じ問題が発生したため、FTP クライアント (Apache) の問題ではないと思います。
問題を再現するテスト コードを次に示します。標準出力に出力しようとしているだけです:
FTPClient ftp = new FTPClient();
ftp.connect("ftp.ncbi.nih.gov");
ftp.login("anonymous", "");
InputStream is = new GZIPInputStream(ftp.retrieveFileStream("/genbank/gbbct1.seq.gz"));
try {
byte[] buffer = new byte[65536];
int noRead;
while ((noRead = is.read(buffer)) != 1) {
System.out.write(buffer, 0, noRead);
}
} finally {
is.close();
ftp.disconnect();
}
なぜこれが起こるのかについてのドキュメントを見つけることができず、デバッガーでコードをたどってもどこにも行きません。明らかな何かが欠けているように感じます。
編集: ファイルを手動でダウンロードし、GZIPInputStream で読み込んで、問題なく印刷できました。2つの異なるJava FTPクライアントでこれを試しました