La parte di codice seguente scarica un file da qualche URL e lo salva in un file locale. Pezzo di torta. Cosa potrebbe essere sbagliato qui?Chi sta manomettendo il mio flusso di dati?
protected long download(ProgressMonitor montitor) throws Exception{
long size = 0;
DataInputStream dis = new DataInputStream(is);
int read = 0;
byte[] chunk = new byte[chunkSize];
while((read = dis.read(chunk)) != -1){
os.write(chunk, 0, read);
size += read;
if(montitor != null)
montitor.worked(read);
}
chunk = null;
dis.close();
os.flush();
os.close();
return size;
}
La ragione per cui sto postando una domanda qui è perché funziona in 99,999% del tempo e non funziona come previsto ogni volta che c'è un antivirus o un altro software di protezione installato su un computer che esegue questo codice. Io sto indicando ciecamente un dito in quel modo perché ogni volta che lo interrompo (o lo disattivo), il codice funziona di nuovo perfettamente. Il risultato finale di tale interferenza è che l'MD5 del file scaricato non corrisponde al previsto e inizia una nuova saga.
Quindi, la domanda è: è davvero possibile che qualche software di "protezione" intelligente possa alterare il flusso effettivo proveniente dall'URL senza che io ne sia a conoscenza? E se sì - come gestisci questo? (verificato con i prodotti Kasperksy e Norton).
EDIT-1: A quanto pare ho una stretta sul problema e non ha niente a che fare con antivirus. Il download avviene dal server FTP (FileZilla in particolare) e usiamo apache commons ftp sul lato client. Quello che ho fatto è andato al server FTP e terminato la connessione (buttato fuori) nel bel mezzo del download. Mi aspettavo che is.read (..) lanciasse una IOException sul lato client, ma questo non è mai accaduto. Invece, is.read (..) restituisce -1, il che significa che non ci sono più dati provenienti dallo stream. Questo è sicuramente inaspettato e spiega perché a volte ottengo file parziali. Ciò non spiega tuttavia perché a volte i dati vengano alterati.
Definire "barfs". – EJP
Come gestisci le espezioni? Se 'dis.close()' genera un'eccezione, il flusso di output non si chiuderà correttamente, ad esempio. – dacwe
@dacwe: qualsiasi cosa generata da questo metodo è un errore, tutto viene interrotto. Il mistero è che niente viene lanciato, tutto viene scaricato bene. Il problema è che non sono i dati che mi aspetto, la maggior parte delle volte è dimezzato, a volte alterato .. – Dima