2013-05-28 2 views
1

공개 anonymous ftp에서 파일을 읽으려고하고 있는데 문제가 있습니다. 나는 일반 텍스트가 잘 파일을 읽을 수 있지만 내가 GZIP 파일에서 읽을 때, 나는이 예외 얻을 : 나는 파일을 다운로드하고 GZIPInputStream에 싸여 FileInputStream를 사용하여 시도GZIP 파일을 읽을 때 GZIPInputStream이 예외를 throw합니다.

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) 

하고 정확한있어 같은 문제, 그래서 나는 그것이 FTP 클라이언트 (아파치)에 문제가 있다고 생각하지 않습니다.

다음은 문제를 재현하는 테스트 코드입니다.

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(); 
    } 

내가 이런 일을 할 이유에 어떤 문서를 찾을 수 없습니다, 어디서나 나를 점점되지 않은 디버거의 코드를 통해 다음과 같은 : 단지 표준 출력에 인쇄하려고합니다. 나는 명백한 것을 놓치고있는 것처럼 느낀다.

EDIT : 수동으로 파일을 다운로드하여 GZIPInputStream으로 읽고 제대로 인쇄 할 수있었습니다. 나는 2 개의 다른 자바 FTP 클라이언트로 이것을 시도했다

답변

3

아, 내가 잘못 알아 냈다. retrieveFileStream에서 반환 된 SocketInputStream이 버퍼링되지 않도록 파일 형식을 FTP.BINARY_FILE_TYPE으로 설정해야합니다.

다음 코드는 작동 :

FTPClient ftp = new FTPClient(); 
    ftp.connect("ftp.ncbi.nih.gov"); 
    ftp.login("anonymous", ""); 
    ftp.setFileType(FTP.BINARY_FILE_TYPE); 
    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(); 
    } 
} 
1

ftp.retrieveFileStream()는 파일 찾기를 지원하지 않기 때문에 먼저 파일을 완전히 다운로드해야한다.

코드는해야한다 :

FTPClient ftp = new FTPClient(); 
ftp.connect("ftp.ncbi.nih.gov"); 
ftp.login("anonymous", ""); 
File downloaded = new File(""); 
FileOutputStream fos = new FileOutputStream(downloaded); 
ftp.retrieveFile("/genbank/gbbct1.seq.gz", fos); 
InputStream is = new GZIPInputStream(new FileInputStream(downloaded)); 

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(); 
} 
+0

그 코드를 (파일 이름을 지정하면) 이전과 동일한 예외를 생성합니다. –