1.网络文件大小的定义
访问目标URL,右键查看网络源文件,把文件源代码复制到新建的txt文档中;
改txt文档的大小为需要的网络文件大小
2.核心方法
代码如下:
1、在没有开放访问外网的条件下,需要加代理访问;
2、第一次连接返回不到数据的情况下,则连接第二次(下有解释原因);
3、提供两种取content-length的方式;
4、最后返回的数据保留了2位小数点;
/**
* 获取网络文件源码大小,不含图片等信息大小
* 通过代理访问,如果第一次获取不到数据,则连接第二次
* @param destUrl 网络html地址 ps:http://www.baidu.com.cn
* @return
* @author admin, 2015年4月16日.
*/
public static double getWebFileCount(String destUrl) {
if(T.isBlank(destUrl)){
return 0;
}
double count = 0;
try {
//获取代理服务器地址、端口
SocketAddress address = new InetSocketAddress(Config.getProxyHost(), Config.getProxyPort());
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
URL url = new URL(destUrl); //创建URL
URLConnection urlConnection = url.openConnection(proxy); //通过代理访问
int length = urlConnection.getContentLength(); //获取contentLength
//第二种获取content-length的方法,两种方法都可以用,如果是大文件,建议第二种方法
//String len = urlConnection.getHeaderField("content-length");
if(length < 0){ //长度获取不到的时候重新连接
urlConnection .setRequestProperty("Accept-Encoding", "identity");
urlConnection.connect();
}
count = T.keep2DecimalPoints(length / 1024.0); //单位KB,保留2位小数点
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
3.二次连接原因
通过debug跟踪以上方法,会发现第一连接,返回的content-length=-1,第二次连接以上才会得到正确的数。因为:在默认情况下,HttpURLConnection 使用 gzip方式获取,文件 getContentLength() 这个方法,每次read完成后可以获得,当前已经传送了多少数据,而不能用这个方法获取 需要传送多少字节的内容,当read() 返回 -1时,读取完成,由于这个压缩后的总长度无法获取,那么就没法计算值了。要取得长度则,要求http请求不要gzip压缩,也就是代码的以下两句:
if (length < 0) { //长度获取不到的时候重新连接
urlConnection .setRequestProperty("Accept-Encoding", "identity");
urlConnection.connect();
}