如何使用RandomAccessFile恢复中断下载?

问题描述 投票:0回答:1

我想使用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恢复中断下载?

java download randomaccessfile
1个回答
0
投票

使用列出的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();

© www.soinside.com 2019 - 2024. All rights reserved.