zoukankan      html  css  js  c++  java
  • Java使用URL类下载的图片不完整

    问题

      今天在使用URL类来下载网站中的图片的时候,出现了一个问题:下载的图片不完整,并且每次下载的图片大小也不是都相同,反正就是不完整。

      问题代码如下:

    package cn.ganlixin.test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class Test {
    	
    	public static void main(String[] args) throws IOException  {
    		URL url = new URL("http://www.baidu.com/favicon.ico");
    		URLConnection conn = url.openConnection();
    
    		// 设置user-agent,预防403
    		conn.setRequestProperty("user-agent", "Chrome/73.0.3683.86");
    
    		InputStream _is = conn.getInputStream();
    		
    		byte[] data = new byte[1024*1024];  // 1M
    		
    		// 一次性下载
    		int length = _is.read(data);
    		
    		OutputStream _os = new FileOutputStream(new File("favicon.ico"));
    		_os.write(data, 0, length);
    		_os.flush();
    		
    		System.out.println("下载 " + url + " 共" + length + "字节内容");
    	}
    
    }
    

      运行多次,输出如下:

    下载 http://www.baidu.com/favicon.ico 共5440字节内容
    下载 http://www.baidu.com/favicon.ico 共16495字节内容
    下载 http://www.baidu.com/favicon.ico 共13455字节内容
    

      上面要下载图片的完整大小应该是16.6KB,但是上面测试多次都没有下载完整。

      刚开始还以为是接收数据的byte数组长度不够,但是当我设置为1M的时候,依旧下载不完整,这就有点不解了。

      网上查了一些资料说是输出的时候没有flush,但是计算的下载的数据长度呀,这和输出是否进行了flush是没有关系的。。

      

    解决方式

      后来我该用了多次read,而不是向上面的代码中一次read,计算总和,这个时候就没有出现数据不完整的情况了。

    package cn.ganlixin.test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class Test {
    	public static void main(String[] args) throws IOException  {
    		URL url  = new URL("http://www.baidu.com/favicon.ico");
    		URLConnection conn = url.openConnection();
    
    		conn.setRequestProperty("user-agent", "Chrome/73.0.3683.86");
    
    		InputStream _is = conn.getInputStream();
    		byte[] data = new byte[1024*100];  // 100KB
    		
    		int tot = 0;
    		int length = 0;
    		
    		OutputStream _os = new FileOutputStream(new File("demo.png"));
    		
    		// 采用多次read的方式
    		while ((length = _is.read(data)) != -1) {
    			tot += length;
    			_os.write(data, 0, length);
    		}		
    		_os.flush();
    		
    		System.out.println("下载 " + url + " 共" + tot + "字节内容");
    	}
    }
    

      运行多次,结果如下:

    下载 http://www.baidu.com/favicon.ico 共16958字节内容
    下载 http://www.baidu.com/favicon.ico 共16958字节内容
    下载 http://www.baidu.com/favicon.ico 共16958字节内容
    

      数据完整了,但是我还是没有明白上面的那个问题出在哪里。

  • 相关阅读:
    Spring基础学习
    云服务器配置java环境
    Struts2学习笔记(一)--入门常见配置
    Hibernate学习笔记(二)
    Hibernate学习笔记(一)
    java---Listener & Filter知识点学习
    java----DBUtils知识点补充
    java----连接池C3p0使用的补充
    IOS之表视图单元格删除、移动及插入
    IOS之表视图添加索引
  • 原文地址:https://www.cnblogs.com/-beyond/p/10621242.html
Copyright © 2011-2022 走看看