【问题标题】:Download a large file over a HTTPConnection - JAVA Applet通过 HTTPConnection 下载大文件 - JAVA Applet
【发布时间】:2012-09-02 10:41:02
【问题描述】:

这可能是一个经常被问到的问题,但我还没有找到正确的答案。

好吧,我有以下代码:

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

这段代码“应该”简单地下载分块的文件..但关键是它没有正确执行。我调试了代码,结果发现它最多可以正确读取 10 个块,但是即使它不是最后一个块,它也会像 chunk_size 的一半一样读取,然后它返回 -1 直到 for(int a...)已经结束了。

在我看来,InputStream 似乎认为它是 EOF,即使它不是!是的,我在普通浏览器上测试了 HTTP 连接,它工作正常。

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

我要下载的文件大概10~Mbyte..

【问题讨论】:

    标签: java http applet download


    【解决方案1】:

    您假设程序正在下载整个块大小,但事实可能并非如此,因为 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2016-03-22
      • 2016-07-19
      • 2016-01-18
      • 2017-05-14
      相关资源
      最近更新 更多