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字节内容

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

posted @ 2019-03-29 14:53  寻觅beyond  阅读(3250)  评论(0编辑  收藏  举报
返回顶部