这可能是一个经常被问到的问题,但我还找不到正确的答案。
好吧,我有以下代码:
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兆字节。。
您假设程序正在下载整个区块大小,但事实可能并非如此,因为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);
}