使用Java下载Zip文件?

8

我正在使用Java从Web服务器下载zip文件,但是每个文件都会丢失大约2kb。我不知道为什么,因为相同的代码在其他格式(如文本、mp3和额外格式)中正常工作。任何帮助都将不胜感激。 以下是我的代码。

public void download_zip_file(String save_to) {
    try {
        URLConnection conn = this.url.openConnection();
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setRequestProperty("content-type", "binary/data");
        InputStream in = conn.getInputStream();
        FileOutputStream out = new FileOutputStream(save_to + "tmp.zip");

        byte[] b = new byte[1024];
        int count;

        while ((count = in.read(b)) > 0) {
            out.write(b, 0, count);
        }
        out.close();
        in.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

1
您是否对托管zip文件的服务器拥有完全控制权?如果使用普通的Web浏览器下载zip文件,它是否有效? - BalusC
@BalusC - 我有同样的问题。当我使用Java下载时,我的zip文件会损坏,但是Web浏览器可以正常工作。请问指定用户代理的代码行是什么? - gansub
@BalusC - 没有二进制/数据内容类型。问题中的代码是错误的。我不确定这是如何被批准的。 - gansub
@Jonik - 你能看一下这个问题中的代码并纠正明显的错误吗? - gansub
1
@gansub:当然,问题中的代码是有问题的,否则OP就不会问关于代码问题的问题了。你最好不要直接修复问题,因为这样会使具体问题无效。相反,只需发布一个能够具体回答问题的答案即可。这就是Stack Overflow的全部意义所在。 - BalusC
显示剩余3条评论
6个回答

3

应该如下所示:

while ((count = in.read(b)) >= 0)

in.read 可能返回 0


无所谓。如果返回0,则没有任何需要写入的内容,因此也不需要写入。 - BalusC
是的,这很重要。-1 应该打破循环,没有其他的东西。 - zckman
我同意zockman的观点。0代表此次迭代中没有可写入的内容,而非所有内容均已完成写入。 - Skip Head

2
在“while ((count = in.read(b)) > 0) {...}”部分之后,out.flush()语句应该被加入,并在out.close()语句之前执行。

0
尝试删除这些行:
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("content-type", "binary/data");

我做了那件事,但什么也没有改变。 - Mohamed

0

我曾经遇到一个从http下载zip文件的问题,后来发现我的下载包含了http头部信息,但这使得我的文件变得更大而不是更小,所以你可能没有这个问题。

顺便说一下,你可以考虑使用Apache Commons Net来处理下载相关的应用程序 - 它真的很棒。


0
几年前,我记得遇到了一个与旧版本Tomcat(5.5.25)相关的问题,会导致大型下载被截断。我们通过升级到5.5.27来解决这个问题。我还记得在早期的Tomcat 6.0版本中发现并解决了同样的问题。
如果这让你想起了什么,请查看Tomcat的变更日志。

0

只能用zip文件?很奇怪。是来自任何服务器还是只有这一个?如果更改文件名(更改扩展名)是否会出现相同的问题?缺少哪些字节?你确定是最后的2K字节而不是中间的某个块等吗?


他在45分钟前的问题评论中提到,通过更改用户代理,他已经使其正常工作。 - BalusC

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