我想使用RandomAccessFile中断下载。这是代码
HttpGet httpget = HttpUtil.buildGet(URL)
httpget.setHeader("RANGE", "bytes=" + (position) + "-");
CloseableHttpResponse response = HttpClients.createDefault().execute(httpget)
HttpEntity entity = response.getEntity();
int totalLen = 0;
InputStream is = entity.getContent();
RandomAccessFile writeFile = new RandomAccessFile(desc, "rw");
writeFile.seek(position);
byte[] buf = new byte[65536];
totalLen = 0;
int len = is.read(buf);
while (len > 0) {
totalLen += len;
writeFile.write(buf);
len = is.read(buf);
}
response.close();
is.close();
writeFile.close();
HttpRequest返回206,下载成功完成,但是我得到了一个错误的文件,该文件比源文件大得多,无法打开它。该代码有什么问题?如何使用RandomAccessFile恢复中断下载?
使用列出的in a comment值,请求指定了32,243,658
的开始位置,并下载了剩余的210,930,449
字节,最后以243,174,107
字节的文件结尾。
好吧,它最终以一个[ 243,204,042
个字节,即29,935
个字节过多的文件结尾,因为即使缓冲区是缓冲区,代码总是写full buffer
没有完整阅读。
65,536
调用中,缓冲区未充满read()
字节。read()
返回len
值是有原因的。您的代码应为:
writeFile.write(buf, 0, len);
[另外,您应该使用try-with-resources,内联read()
调用很常见,因此不会重复,例如代码应为:
int totalLen = 0; try (RandomAccessFile writeFile = new RandomAccessFile(desc, "rw")) { writeFile.seek(position); // should use value from response header here, not requested value try (InputStream is = entity.getContent()) { byte[] buf = new byte[65536]; for (int len; (len = is.read(buf)) > 0; ) { totalLen += len; writeFile.write(buf, 0, len); } } } response.close();