0

我正在用 Java 制作一个从网络服务器下载文件的应用程序。该文件是一个 816kb 的 zip 文件。我已经在 3 台不同的计算机上测试了该应用程序,但它不适用于一台计算机。对于那个它只下载 13kb 的文件然后停止。当我检查 htaccess 日志时,我看到:

a: "GET /cache.zip HTTP/1.1" 200 816938 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_07"

b: "GET /cache.zip HTTP/1.1" 200 134320 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_09"

(PC a 工作,PC b 不工作)

我已经尝试了很多不同的方法来用 java 下载文件,但是对于所有方法,它在 13kb 之后停止下载。我也试过用 512m 内存运行 te 应用程序,但这不是问题。

这就是我现在所拥有的:

DataInputStream in = new DataInputStream(conn.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(new File(Config.CACHE_DIR+File.separator+"cache.zip")));
byte[] data = new byte[1024];

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

但是这个while循环不会停止,所以它会卡在in.read

4

2 回答 2

0

我通常使用 Apache Commons IO IOUtils.copy()在流之间进行复制。它使用缓冲区将字节从一个流复制到另一个流。

顺便说一句,在您的情况下,无需使用Data InputStream 和 DataOutputStream 包装器。您可以直接使用 InputStream 和 FileOutputStream。

使用 IOUtils,代码将变为:

InputStream in = conn.getInputStream();
File outputFile = new File(Config.CACHE_DIR + File.separator + "cache.zip");
OutputStream out = new FileOutputStream(outputFile);
try {
    IOUtils.copy(in, out);
} finally {
    output.close();
}

如果你不想使用 IOUtils...

int count;
byte[] data = new byte[1024];
while ((count = in.read(data)) > 0) {
     out.write(data, 0, count);
}
于 2012-10-28T16:16:41.610 回答
0

运行一个简单的独立测试,以确保问题出在 PC 而不是您的软件:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class Scratch {

public static void main(String[] args) throws IOException {
    URL url = new URL("http://url.to.zip");

    InputStream in = url.openStream();
    FileOutputStream out = new FileOutputStream("test.zip");
    byte[] buffer = new byte[1024];
    int read = 0;
    while ((read = in.read(buffer)) >= 0) {
        out.write(buffer, 0, read);
    }
}

}
于 2012-10-28T16:48:47.617 回答