问题

  今天在使用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使用URL类下载的图片不完整的更多相关文章

  1. java之URL类

    Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...

  2. Java的URL类(二)

    转:https://www.cnblogs.com/brokencolor/p/8575440.html Java的URL类(二) 实例: Java 通过HttpURLConnection Post方 ...

  3. Java的URL类(一)

    转:https://www.cnblogs.com/blackiesong/p/6182038.html Java的URL类(一) Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平 ...

  4. Java-->利用URL类下载图片

    --> 通过get 请求访问图片地址,将通过服务器响应的数据(即图片数据)存到本地文件中... --> HttpURLConnectionUtil 工具类 package com.drag ...

  5. Java 使用URL类通过url下载网络资源

    主要用到的类 地址类: URL http类: HttpURLConnection 输入流: InputStream 输出流: FileOutputStream 上代码 package com.demo ...

  6. Java的URL来下载网页源码

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...

  7. 使用JAVA的URL类处理url事例

    import java.net.*; import java.io.*; public class ParseURL { public static void main(String[] args) ...

  8. java.net.URL类

    package com.mozq.boot.kuayu01.demo; import java.net.MalformedURLException; import java.net.URL; publ ...

  9. Java中的URL类

    Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...

随机推荐

  1. Nginx安装与代理

    1.第一步 - 添加Nginx存储库 要添加CentOS 7 EPEL存储库,请打开终端并使用以下命令: sudo yum install epel-release 2.第二步 - 安装Nginx 现 ...

  2. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...

  3. 警惕挂着开源的招牌到处坑蒙拐骗的垃圾项目,比如iBase4J

    开源界,本是技术爱好者百花齐放.各显其能的地方.但是,不管什么好东西,到了这块奇葩的土地都能变了味.现在的开源界,真的是鱼龙混杂,有些开源软件,不知道是噱头喊得高,还是star刷得好,竟能凭借一身垃圾 ...

  4. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

  5. springboot~如何去掌握它(新手可以看看)

    springboot~如何去掌握它 主讲:仓储大叔 每讲40分钟 架构图 graph LR App-->A Web-->A A(zuul proxy)-->B(eureka serv ...

  6. .NET Core 2.2 新增部分功能使用尝鲜

    前言     美国当地时间12月4日,微软2019开发者大会中发布了一系列的重磅消息,包含了软硬件和开源社区的各种好消息是铺天盖地,作为一名普通的开发者,我第一时间下载了 .NET Core 2.2 ...

  7. cocos creator主程入门教程(三)—— 资源管理

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 在初识篇,我介绍过怎样加载prefab.cocos提供了一系列的加载接口,包括cc.loader.loa ...

  8. Elasticsearch简介与实战

    什么是Elasticsearch?   Elasticsearch是一个开源的分布式.RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene.   Lucene 可以说是 ...

  9. .net core jwt 入门记录

    从百度里搜索里搜索了很多jwt的文章,跟着文章写了一个demo,这里记录下学习过程中碰上的问题.看文章多遍,不如手工实现一次. 模板已上传到github.com:dogvane/webapi_jwt_ ...

  10. Mysql 的 create as 和create like 区别

    大家可能使用Navicat Premium时发现很方便,比如复制表或数据结构等,其实这种复制表数据或结构方法就是create table as 和create table like 这种方式实现细心的 ...