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 的实际流?如果是的话 - 你如何处理这个?(经卡巴斯基和诺顿产品验证)。


EDIT-1: 显然我已经控制了这个问题,它与防病毒软件无关。下载从 FTP 服务器(特别是 FileZilla)进行,我们在客户端使用 apache commons ftp。我所做的是转到 FTP 服务器并在下载过程中终止连接(将其踢出)。我预计 is.read(..) 会在客户端抛出一个 IOException ,但这从未发生过。相反, is.read(..) 返回 -1 意味着没有更多数据来自流。这绝对是出乎意料的,并解释了为什么有时我会得到部分文件。然而,这并不能解释为什么有时数据也会被更改。

4

1 回答 1

1

是的,这一直发生在我身上。就我而言,这是由 Websense 在我的公司网络上进行的透明 HTTP 代理引起的。最严重的问题是由返回 200 OK 的块页面引起的。

您是否每次都遇到相同或类似的腐败?例如,您是否得到一些 HTML 来解释请求被阻止的原因?您可以做的最好的可能是将下载数据的前几个字节与块页面中的某些文本进行比较,并在这种情况下抛出异常。

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

于 2012-08-16T10:47:54.180 回答