Qual è il modo migliore per monitorare un InputStream?
-
09-09-2019 - |
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?
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.