Java使用URL类下载的图片不完整
2023-09-14 08:56:52 时间
问题
今天在使用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字节内容
数据完整了,但是我还是没有明白上面的那个问题出在哪里。
相关文章
- 二级java程序设计--Java SDK6.0的下载和操作[通俗易懂]
- Java连接MySQL mysql-connector-java-bin.jar驱动包的下载与安装
- Java删除文件(delete file in java)[通俗易懂]
- java解析xml文档并保存到数据库
- java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
- protostuff java_Protostuff一键序列化工具、Protobuf JAVA实现
- 我的世界java版需要多少钱_我的世界Java版20w49a快照版[通俗易懂]
- java集合类面试题_Java集合类相关面试题
- java编程软件下载_Ee Java(Java编程软件) V1.1.0 官方版
- java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]
- 物业管理系统源码java_Java小区物业管理系统 源码报告下载
- sqlformat数字格式化_java怎么输出数字
- 输出最小值及所在数组下标_java数组最大值和下标
- Java文件操作大全详解编程语言
- java根据图片的url地址下载图片到本地详解编程语言
- java学习笔记08–泛型详解编程语言
- Java程序员必备知识,《JAVA编程思想》包和访问权限详解编程语言
- Java 与 Linux 的结合:开启新时代(java和linux)
- 机制Java实现Redis过期机制(redisjava过期)
- 实现Redis中Java实现自动失效数据(redisjava过期)
- Java程序如何在Linux上顺利部署?快来了解一下!(java部署到Linux)
- 进程Linux下创建多个Java进程的简易方法(linux 多个java)
- Linux 下安装Java:快速从零开始(linux 下载java)
- Java桥接Oracle让数据轻松流动(java桥接oracle)
- 存储过程使用Java语言执行Oracle存储过程(java执行oracle)
- Java加速Oracle开发之旅(java中oracle包)