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字节内容
数据完整了,但是我还是没有明白上面的那个问题出在哪里。
如需转载,请注明文章出处,谢谢!!!