问题

  今天在使用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. .NET Core 的缓存篇之MemoryCache

    前言 对于缓存我们都已经很熟悉了,缓存分为很多种,浏览器缓存.试图缓存.服务器缓存.数据库缓存等等一些,那今天我们先介绍一下视图缓存和MemoryCache内存缓存的概念和用法: 视图缓存 在老的版本 ...

  2. SpringBoot + Spring Security 学习笔记(二)安全认证流程源码详解

    用户认证流程 UsernamePasswordAuthenticationFilter 我们直接来看UsernamePasswordAuthenticationFilter类, public clas ...

  3. RabbitMQ消息队列(一)-RabbitMQ的优劣势及产生背景

    本篇并没有直接讲到技术,例如没有先写个Helloword.我想在选择了解或者学习一门技术之前先要明白为什么要现在这个技术而不是其他的,以免到最后发现自己学错了.同时如果已经确定就是他,最好先要了解下技 ...

  4. [Nodejs] node的fs模块

    fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...

  5. 【网摘】C#.NET 在 MVC 中动态绑定下拉菜单的方法

    1. 已知下拉菜单列表项: 在 Controller 控制器类中输入已下代码  1 public class DemoController : Controller 2 { 3     public  ...

  6. [.NET] 使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复

    使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复 目录 一.前提 二.基本配置信息简析 三.配置服务器地址(URL) 四.请求处理 一.前提 先申请微信公众号的授权,找到或配置 ...

  7. jQuery(三)、属性、CSS

    jQuery设置了很多为标签进行属性的操作,比如添加.删除. 一 .属性 1 attr(name | properties | [key, value | fn]) 设置或返回被选择的属性值. 参数: ...

  8. Java学习点滴——Class和反射

    基于<Java编程思想>第四版 前言 我们要操作一个类实例对象时,一般都要先知道这个类有哪些方法或者成员变量.反射就是在我们不知道这个类有哪些方法或成员变量时,使用特定方式得到类的这些信息 ...

  9. 【译】最大限度地降低多线程 C# 代码的复杂性

    分支或多线程编程是编程时最难最对的事情之一.这是由于它们的并行性质所致,即要求采用与使用单线程的线性编程完全不同的思维模式.对于这个问题,恰当类比就是抛接杂耍表演者,必须在空中抛接多个球,而不要让它们 ...

  10. spring javaconfig druidsource

    package dataConfig; import java.sql.SQLException; import org.springframework.context.annotation.Bean ...