我正在使用以下代码通过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();
答案 0 :(得分:3)
con.getContentLength()
可以为您提供所需内容,但前提是服务器将其作为响应标头提供。如果服务器使用"chunked" encoding而不是提供Content-Length标头,则预先无法获得总长度。
答案 1 :(得分:1)
查看继承自getContentLength()
的{{1}}方法here HttpURLConnection
。
答案 2 :(得分:0)
您可以使用InputStream#available()方法。
它返回对此输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
下一次调用可能是同一个线程或另一个线程。单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
FileInputStream fis = new FileInputStream(destinationPath+"."+remoteFile.getExtension());
System.out.println("Total file size to read (in bytes) : "+ fis.available());