2013-04-14 14 views
6

Ho bisogno di una funzione molto semplice che mi permetta di leggere i primi 1k byte di un file tramite FTP. Voglio usarlo in MATLAB per leggere le prime righe e, in base ad alcuni parametri, per scaricare solo i file che ho davvero bisogno alla fine. Ho trovato alcuni esempi online che purtroppo non funzionano. Qui sto proponendo il codice di esempio in cui sto cercando di scaricare un singolo file (sto usando le librerie di Apache).Leggere i primi byte di un file

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

l'errore è nel flusso che viene restituito vuoto. So che sto passando il nome della cartella in modo sbagliato, ma non riesco a capire come devo fare. Ho provato in molti modi.

Ho anche provato con le classi Java del URL come:

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

ma sta dando un errore quando sto chiudendo l'InputStream in!

Sono decisamente bloccato. Alcuni commenti sarebbero molto utili!

+0

Benvenuti a StackOverflow! Non è necessario aggiungere tag al tuo titolo, esiste un sistema di tag per questo. Per ulteriori informazioni, leggi http://meta.stackexchange.com/q/19190/147072. Inoltre, non è necessario aggiungere "Grazie" o il tuo nome alla fine, tutti sono grati per l'aiuto e il tuo nome viene visualizzato nella scheda del personaggio in basso a destra di ogni domanda e risposta che crei. – Patrick

risposta

1

Prova questa prova

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

funziona sicuramente

+0

Ciao, il codice funziona solo se l'intero file è stato scaricato. Ho aggiunto due righe in cui memorizzo i dati in un file di output nel mio disco locale. Quando eseguo il codice da MATLAB, scarica il file (posso vederlo sulla cartella e posso aprirlo) ma rimane bloccato sulla linea in cui la connessione di input è chiusa (is.close()). Se rimuovo la linea funziona. Il fatto è che non so come sia gestita la connessione e vorrei evitare di tenere aperte le porte senza motivo. Ultima cosa. Se scarico tutto il file, is.close() funziona correttamente! Questo è qualcosa che mi sta facendo impazzire :). – user2279697

-1

non riesco a capire il motivo per cui non funziona. Ho trovato questo link dove hanno usato la libreria Apache per leggere 4096 byte ogni volta. Ho letto i primi 1024 byte e alla fine funziona, l'unica cosa è che se si utilizza fullPendingCommand(), il programma viene mantenuto per sempre. Così l'ho rimosso e tutto funziona bene.

0

Dalla mia esperienza di lettura di byte da uno stream acquisito da ftpClient.retrieveFileStream, per la prima esecuzione non è garantito che il buffer di byte venga riempito. Tuttavia, o si dovrebbe leggere il valore di ritorno di stream.read(b); circondato con un ciclo basato su di esso o utilizzare una libreria avanzata per riempire il buffer di 1024 byte di lunghezza []:

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); 
} 
Problemi correlati