下面的代码片段从某个URL下载文件并将其保存到本地文件。小菜一碟。这可能有什么不对吗?
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;
}
我在这里发布问题的原因是因为它在99.999%的时间内工作,并且只要在运行此代码的计算机上安装了防病毒软件或其他一些保护软件,它就无法正常工作。我盲目地指着一个手指,因为每当我停止(或禁用)它时,代码再次完美。这种干扰的最终结果是下载文件的MD5与预期的不匹配,并开始全新的传奇。
所以,问题是 - 一些智能“保护”软件真的有可能在不知情的情况下改变来自URL的实际流吗?如果是的话 - 你怎么处理这个? (使用Kasperksy和诺顿产品验证)。
修改-1: 显然我已经解决了这个问题,它与防病毒无关。下载发生在FTP服务器(特别是FileZilla),我们在客户端使用apache commons ftp。我做的是去了FTP服务器并在下载过程中终止了连接(踢出去)。我希望is.read(..)会在客户端抛出IOException,但这从未发生过。相反,is.read(..)返回-1意味着没有更多数据来自流。这绝对是意料之外的,并解释了为什么有时我得到部分文件然而,这并不能解释为什么有时数据也会被改变。
答案 0 :(得分:1)
是的,这一直发生在我身上。在我的情况下,它是由我公司网络上的Websense透明HTTP代理引起的。最糟糕的问题是由块页面以200 OK返回。
每次都会得到相同或类似的腐败吗?例如,你得到一些HTML解释为什么请求被阻止?您可能做的最好的事情是将下载数据的前几个字节与块页面中的某些文本进行比较,并在这种情况下抛出异常。
编辑:根据您的更新,您是否已将FTP客户端设置为图像/二进制模式?