2013-04-14 23 views
6

Potrzebuję bardzo prostej funkcji, która pozwala mi odczytać pierwsze 1k bajtów pliku przez FTP. Chcę go użyć w MATLAB-u, aby przeczytać pierwsze wiersze i, zgodnie z niektórymi parametrami, pobrać tylko te pliki, których naprawdę potrzebuję w końcu. Znalazłem kilka przykładów online, które niestety nie działają. Tutaj proponuję przykładowy kod, w którym próbuję pobrać jeden plik (używam bibliotek Apache).Przeczytaj pierwsze bajty pliku

FTPClient client = new FTPClient(); 
    FileOutputStream fos = null; 

    try { 
     client.connect("data.site.org"); 

     // filename to be downloaded. 
     String filename = "filename.Z"; 
     fos = new FileOutputStream(filename); 

     // Download file from FTP server 
     InputStream stream = client.retrieveFileStream("/pub/obs/2008/021/ab120210.08d.Z"); 
     byte[] b = new byte[1024]; 
     stream.read(b); 
     fos.write(b); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) { 
       fos.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

błąd jest w strumieniu, który jest zwracany pusty. Wiem, że przekazuję nazwę folderu w niewłaściwy sposób, ale nie mogę zrozumieć, jak mam to zrobić. Próbowałem na wiele sposobów.

Ja również próbowałem z klas Javy adres URL jako:

URL url; 

    url = new URL("ftp://data.site.org/pub/obs/2008/021/ab120210.08d.Z"); 

    URLConnection con = url.openConnection(); 
    BufferedInputStream in = 
      new BufferedInputStream(con.getInputStream()); 
    FileOutputStream out = 
      new FileOutputStream("C:\\filename.Z"); 

    int i; 
    byte[] bytesIn = new byte[1024]; 
    if ((i = in.read(bytesIn)) >= 0) { 
     out.write(bytesIn); 
    } 
    out.close(); 
    in.close(); 

ale daje błąd, gdy jestem zamykającą InputStream w!

Zdecydowanie utknąłem. Niektóre komentarze na temat będą bardzo przydatne!

+0

Witamy StackOverflow! Nie ma potrzeby dodawania tagów do tytułu, istnieje system tagów do tego. Więcej informacji można znaleźć na stronie http://meta.stackexchange.com/q/19190/147072. Nie musisz też dodawać "podziękowania" lub nazwiska, wszyscy są wdzięczni za pomoc, a Twoje nazwisko jest wyświetlane w arkuszu postaci w prawym dolnym rogu każdego pytania i odpowiedzi, które tworzysz. – Patrick

Odpowiedz

1

Spróbuj tego testu

InputStream is = new URL("ftp://test:[email protected]/bookstore.xml").openStream(); 
    byte[] a = new byte[1000]; 
    int n = is.read(a); 
    is.close(); 
    System.out.println(new String(a, 0, n)); 

to na pewno działa

+0

Witam, kod działa tylko wtedy, gdy cały plik zostanie pobrany. Dodałem dwie linie, w których przechowuję dane w pliku wyjściowym na dysku lokalnym. Kiedy uruchomię kod z MATLAB, pobierze on plik (widzę go w folderze i mogę go otworzyć), ale utknie w linii, w której połączenie wejściowe jest zamknięte (is.close()). Jeśli usunę linię, działa. Chodzi o to, że nie wiem, jak zarządza się połączeniem i chciałbym uniknąć otwierania portów bez powodu. Ostatnia rzecz. Jeśli ściągnę cały plik, is.close() działa poprawnie! To coś, co doprowadza mnie do szaleństwa :). – user2279697

-1

Nie mogę zrozumieć, dlaczego to nie działa. Znalazłem to link, gdzie używali biblioteki Apache do czytania 4096 bajtów za każdym razem. Przeczytałem pierwsze 1024 bajty i działa to w końcu, jedyną rzeczą jest to, że jeśli użyto metody completePendingCommand(), program będzie trwał wiecznie. Dlatego usunąłem go i wszystko działa dobrze.

0

Z mojego doświadczenia wynika, że ​​po przeczytaniu bajtów ze strumienia uzyskanego z ftpClient.retrieveFileStream, dla pierwszego uruchomienia nie jest gwarantowane wypełnienie bufora bajtu. Jednakże, bądź należy odczytać wartość zwracaną stream.read(b); otoczony cyklu opartego na nim lub użyć zaawansowanych biblioteki dopełnić [] bufor 1024 bajt długości:

InputStream stream = null; 
try { 
    // Download file from FTP server 
    stream = client.retrieveFileStream("/pub/obs/2008/021/ab120210.08d.Z"); 
    byte[] b = new byte[1024]; 
    IOUtils.read(stream, b); // will call periodically stream.read() until it fills up your buffer or reaches end-of-file 
    fos.write(b); 

} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    IOUtils.closeQuietly(inputStream); 
} 
Powiązane problemy