下面的代码从某个URL下载文件并将其保存到本地文件中。非常简单。可能会有什么问题呢?
我在此发布问题的原因是,这段代码在99.999%的时间里都能正常工作,但当计算机上安装了杀毒软件或其他保护软件时,它就不像预期那样工作。我盲目地指出这一点,因为每当我停止(或禁用)它时,代码就会再次完美地工作。这种干扰的最终结果是下载文件的MD5值与预期不符,整个新的故事开始了。
所以问题是 - 是否真的有一些聪明的“保护”软件可以在我不知情的情况下改变来自URL的实际流?如果是这样-你如何处理?(已验证Kasperksy和Norton产品)。
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和Norton产品)。
编辑-1: 显然我已经找到了问题所在,与杀毒软件无关。下载是从FTP服务器(具体来说是FileZilla)进行的,我们在客户端使用apache commons ftp。我所做的是去FTP服务器并在下载过程中终止连接(踢出)。我期望is.read(..)在客户端抛出IOException,但这从未发生过。相反,is.read(..)返回-1,这意味着没有更多数据来自流。这肯定是意外的,并解释了为什么有时我只得到部分文件。然而,这并不能解释为什么有时数据也会被改变。
dis.close()
抛出异常,则输出流将无法正确关闭。 - dacwe