Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇元';无法完成zip文件的下载_Java_Download - Fatal编程技术网

Java 爪哇元';无法完成zip文件的下载

Java 爪哇元';无法完成zip文件的下载,java,download,Java,Download,我正在用Java制作一个从Web服务器下载文件的应用程序。此文件是一个816kb的zip文件。我已经在3台不同的计算机上测试了该应用程序,但它在一台计算机上不起作用。对于这一个,它只下载13kb的文件,然后停止。当我检查htaccess日志时,我看到: 答:“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“-”Mozi

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

答:“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循环不会停止,所以它会卡在
中。read

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

顺便说一下,在您的案例中不需要使用DataInputStream和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);
}

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

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);
    }
}

}

java不会影响服务器上的内容。如果有两个相同的url请求生成两个不同大小的响应,则会发生其他情况。请将代码放入try-catch块中,并让可能的异常打印堆栈跟踪,这样我们就可以知道是否存在问题。已经存在问题,但没有错误。根据DataInputStream.read(…)的文档,它只是在等待in.read:“此方法会一直阻止,直到输入数据可用、检测到文件结尾或引发异常为止。”这似乎是一个连接/传输问题。感谢您的回答,但我正在寻找一个不使用外部库的解决方案。已更新以提供一个没有库的答案。已尝试,但不起作用。我也尝试过NIO方法,但也不起作用。我认为这是一个问题,在电脑上,试图下载它,因为它是工作在2台电脑上,而不是工作在1台电脑上。