2012-09-02 143 views
2

这可能是一个经常被问到的问题,但我找不到正确的答案。通过HTTPConnection下载大文件 - JAVA Applet

嗯,我有以下代码:

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兆字节〜..

回答

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