谁在篡改我的数据流?

5
下面的代码从某个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和Norton产品)。

编辑-1: 显然我已经找到了问题所在,与杀毒软件无关。下载是从FTP服务器(具体来说是FileZilla)进行的,我们在客户端使用apache commons ftp。我所做的是去FTP服务器并在下载过程中终止连接(踢出)。我期望is.read(..)在客户端抛出IOException,但这从未发生过。相反,is.read(..)返回-1,这意味着没有更多数据来自流。这肯定是意外的,并解释了为什么有时我只得到部分文件。然而,这并不能解释为什么有时数据也会被改变。


1
你如何处理异常?例如,如果 dis.close() 抛出异常,则输出流将无法正确关闭。 - dacwe
@dacwe - 无论从这个方法中抛出什么,都会导致失败,一切都会被中止。奥秘在于没有任何异常被抛出,所有东西都能够正常下载。问题在于它下载的数据不是我期望的,大部分时间都被截断了,有时还会被修改。 - Dima
定义“错误”。内容的一部分是否只是移动了几个位,从某一点开始是否全部为零,还是只是随机位(或者你在其中看到某种模式)? - brimborium
@Dima:你本可以默默地忽略这个异常(它不在上面的代码/问题中)。 - dacwe
@dacwe - 不,这个方法的调用者会在出错时中止任何操作,我不想发布太多无关的代码。 - Dima
显示剩余5条评论
1个回答

1

是啊,这种情况经常发生。在我的情况下,这是由于我们公司网络上的Websense进行透明HTTP代理造成的。最糟糕的问题是返回的阻止页面带有200 OK。

你每次都遇到相同或类似的损坏吗?例如,您是否会收到一些HTML来解释为什么请求被阻止?您可能能做的最好的事情就是将下载数据的前几个字节与阻止页面中的某些文本进行比较,并在这种情况下抛出异常。

编辑:根据您的更新,您是否已将FTP客户端设置为图像/二进制模式?


在我的情况下,这不是文本,我会注意到究竟被篡改了什么。我下载二进制安装包,所以很难说其中的哪一部分被炸毁了。最终结果是损坏的二进制文件和终端用户的彻底混乱,他们指责我,而实际上它可能是他们网络中的某些东西。 - Dima
你需要将错误的字节写入磁盘并查看它们。 - artbristol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接