El fragmento de código siguiente descarga un archivo de alguna URL y lo guarda en un archivo local. Pedazo de pastel. ¿Qué podría estar mal aquí?¿Quién está manipulando mi secuencia de datos?
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 razón por la que estoy publicando una pregunta aquí es porque funciona en el 99,999% de las veces y no funciona como se espera cada vez que hay un antivirus o algún otro software de protección instalado en un equipo que ejecuta el código. Estoy señalando ciegamente un dedo de esa manera porque cada vez que lo detengo (o lo deshabilito), el código funciona perfectamente de nuevo. El resultado final de tal interferencia es que el MD5 del archivo descargado no coincide con el esperado, y comienza una saga completamente nueva.
Entonces, la pregunta es: ¿es realmente posible que algún software inteligente de "protección" altere la transmisión actual proveniente de la URL sin que yo lo sepa? Y si es así, ¿cómo lidias con esto? (verificado con los productos Kasperksy y Norton).
EDITAR-1: Al parecer tengo una bodega en el problema y que no tiene nada que ver con los antivirus. La descarga se realiza desde el servidor FTP (FileZilla en particular) y utilizamos apache commons ftp en el lado del cliente. Lo que hice fue al servidor FTP y finalicé la conexión (expulsado) en medio de la descarga. Esperaba que is.read (..) arrojara una IOException en el lado del cliente, pero esto nunca sucedió. En cambio, is.read (..) devuelve -1, lo que significa que no hay más datos procedentes de la transmisión. Esto es definitivamente inesperado y explica por qué a veces obtengo archivos parciales. Esto no explica por qué a veces los datos también se alteran.
Define 'barfs'. – EJP
¿Cómo manejas las excepciones? Si 'dis.close()' arroja una excepción, la secuencia de salida no se cerrará correctamente, por ejemplo. – dacwe
@dacwe: lo que sea que se arroje de este método es una falla, todo se cancela. El misterio es que no se arroja nada, todo se descarga bien. El problema es que no son los datos que espero, la mayoría de las veces se reduce a la mitad, a veces alterado. – Dima