我正在用Java编写一个从Web服务器下载文件的应用程序。此文件是一个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
答案 0 :(得分: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);
}
答案 1 :(得分: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);
}
}
}