Domanda

Sto leggendo un file in via apache.commons.FtpClient.

Questo funziona bene il 99,9% del tempo, ma a volte muore solo nel metodo read () ...

InputStream inStream = ftp.retrieveFileStream(path + file.getName());
String fileAsString = "";

if(inStream == null){
    return;
}
while((c = inStream.read()) != -1){ //this is where the code sometimes just hangs               
   fileAsString += Character.valueOf((char)c);

}

La mia domanda è che cosa è il modo più affidabile per proteggere contro questo blocco il sistema a tempo indeterminato. Dovrei essere impostando un timer in un thread separato? O c'è un modo più semplice per farlo?

È stato utile?

Soluzione

Proprio da un rapido sguardo ai documenti, se l'avete fatto ...

while (inStream.available() > 0 && (c = inStream.read()) != -1)

Sembra che raddoppierebbe verificare che si può leggere senza bloccare prima che realmente leggere. Io non sono certo su questo però.

Altri suggerimenti

Se il codice si blocca significa che il server FTP non ha inviato l'intero file. È possibile utilizzare un timer, ma credo FtpClient consente di impostare un timeout.

A proposito: il modo in cui si legge il file è molto inefficiente. Se il file è più grande di un paio di K userà quantità crescenti di CPU.

Si sta creando un personaggio di un byte (che è una cattiva idea in sé) e un oggetto String per ogni byte nel file.

Io suggerisco di usare il metodo della copia fornito o quello che viene fornito con la libreria commons-IO per copiare i dati in un ByteArrayInputStream.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top