1

我正在使用以下代码通过 http 从远程位置下载文件。某些资产未完全下载并且似乎已损坏。看起来大约有 5% 的时间。我认为通过提前获取文件大小并将其与我下载的内容进行比较以确保没有遗漏任何内容来确保我已经下载了完整文件会很好。

通过一些谷歌搜索并查看我已经在使用的对象,我看不到获得此文件大小的明显方法。有人可以指出我正确的方向吗?

HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setInstanceFollowRedirects(true);

InputStream is = con.getInputStream();
file = new File(destinationPath+"."+remoteFile.getExtension());

BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath()));
while ((i = bis.read()) != -1) {
   bos.write(i);
}
bos.flush();
bis.close();
4

3 回答 3

3

con.getContentLength() 可能会给您想要的东西,但前提是服务器将其作为响应标头提供。如果服务器使用“分块”编码而不是提供 Content-Length 标头,则总长度不能预先提供。

于 2013-07-29T15:16:49.477 回答
1

在这里查看继承自的getContentLength()方法。 HttpURLConnectionURLConnection

于 2013-07-29T15:16:34.223 回答
0

您可以使用InputStream#available()方法。

它返回对可以从此输入流读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。

下一次调用可能是同一个线程或另一个线程。单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节。

FileInputStream fis = new FileInputStream(destinationPath+"."+remoteFile.getExtension());
System.out.println("Total file size to read (in bytes) : "+ fis.available());
于 2013-07-29T15:20:06.303 回答