2012-09-02 160 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); 
}