java 获取网络文件大小

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();      
}


你可能感兴趣的:(java,获取网络文件大小,获取网络文件大小)