通过HTTPConnection下载大文件 - JAVA Applet

时间:2012-09-02 10:41:03

标签: java http applet download

这可能是一个经常被问到的问题,但我找不到合适的答案。

好吧,我有以下代码:

java.net.URL url = new java.net.URL(built);
java.net.HttpURLConnection con = (HttpURLConnection)url.openConnection();

if (con.getResponseCode() != 200) {
    // error handle here!;
    continue;
}

// begin to download the file
int file_size = con.getContentLength();

FileOutputStream stream = new FileOutputStream(m_WorkingDir + "/" + getFilenameWithPath(i));
InputStream remoteStream = con.getInputStream();

int chunks = (int) Math.ceil((float)file_size / (float)CHUNK_SIZE);

// download each chunk
byte[] temp = new byte[CHUNK_SIZE];
for(int a = 0; a < chunks; a++) {
    // calculate chunk size
    int chunk_size = CHUNK_SIZE;

    if(a == chunks-1) {
        // last chunk
        chunk_size = file_size - a * CHUNK_SIZE;
        System.out.println("Download last chunk : " + chunk_size);
    }

    // download chunk
    int bytes = remoteStream.read(temp, 0, chunk_size);
    stream.write(temp, 0 ,chunk_size); // save to local filesystem
}

stream.close();
remoteStream.close();
con.disconnect();

此代码“应该”只是简单地下载文件chunked ..但关键是它没有正确执行。我调试了代码,事实证明它正确地读取了~10个块但是它读起来就像chunk_size的一半,即使它不是最后一个块,然后它返回-1直到for(int a ...)已经结束了。

对我来说,似乎InputStream认为它是EOF,即使它不是!是的,我通过普通的浏览器测试了HTTP连接,它运行正常。

它使用CHUNK_SIZE的多个设置测试了代码,但它始终具有相同的结果。

我要下载的文件大约是10~Mby ..

1 个答案:

答案 0 :(得分:3)

你假设程序要下载整个块大小,但可能不是这样,因为java说: -

  

尝试读取len(CHUNK_SIZE)个字节,但数字较小   可能会被读取,可能为零。

这可能有用: -

byte[] temp = new byte[CHUNK_SIZE];
int bytes = 0;
for(int a = 0; a < chunks; a++) {
    bytes =remoteStream.read(temp, 0, CHUNK_SIZE);
    if(bytes == -1) {
      System.out.println("Downloaded last chunk : Terminating ");
      break;
    }
    stream.write(temp, 0 ,bytes);
}