当前位置: 首页 > article >正文

记HttpURLConnection下载图片

目录

一、示例代码1

二、示例代码2


一、示例代码1

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;


public class Test {


    /**
     * 下载图片
     */
    public void getNetImg() {
        InputStream inStream = null;
        FileOutputStream fOutStream =null;
        try {
            // URL 统一资源定位符
            URL url = new URL("https://t7.baidu.com/it/u=825057118,3516313570&fm=193&f=GIF");
            // 建立HttpURLConnection连接对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 设定 请求方式
            connection.setRequestMethod("GET");
            // 连接服务器
            connection.connect();

            // 判断请求响应是否成功,响应的状态码。200 响应成功、404 或 500等
            if(connection.getResponseCode()==200){
                System.out.println("connection.getResponseCode()返回的状态码:"+connection.getResponseCode());
                // 从输入流中读取
                inStream = connection.getInputStream();
                // 文件输出流
                fOutStream = new FileOutputStream(new File("E:\\天空之城.jpg")); //new File("myImg.jpg")默认存储在项目根目录
                // 定义缓存字节数组,存放图片
                byte[] bs = new byte[1024];
                int len  = 0;
                while((len = inStream.read(bs))!=-1){ //inStream.read(bs);返回的是数组的长度。最多一次读出bs.length个字节,读到文件末尾返回-1
                    fOutStream.write(bs, 0, len); //写入到文件输出流中
                    fOutStream.flush(); // 强制持久化到存储设备,然后清空缓存
                }
            } else {
                System.out.println("响应失败!状态码:"+connection.getResponseCode());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(inStream!=null){
                try {
                    inStream.close(); // 关闭输入流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fOutStream!=null){
                try {
                    fOutStream.close(); // 关闭输出流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

下载后存储的主要代码:

// 从输入流中读取
inStream = connection.getInputStream();
// 文件输出流
fOutStream = new FileOutputStream(new File("E:\\天空之城.jpg"));
注:new File("E:\\天空之城.jpg")指定下载后文件的保存位置。new File("myImg.jpg")默认存储在项目根目录

// 定义缓存字节数组,存放图片
byte[] bs = new byte[1024];
int len  = 0;

//inStream.read(bs);返回的是数组的长度。最多一次读出bs.length个字节,读到文件末尾返回-1
while((len = inStream.read(bs))!=-1){ 
    fOutStream.write(bs, 0, len); //写入到文件输出流中
    fOutStream.flush(); // 强制持久化到存储设备,然后清空缓存
}

二、示例代码2

import org.apache.commons.codec.binary.Base64;
import org.springframework.util.FileCopyUtils;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class Test {

    public Map<String, String> getWFile() throws Exception {

        // 定义map
        Map<String, String> map = new HashMap<String, String>();

        URL url = new URL("https://gd-hbimg.huaban.com/02e9bd22213105052e000fa3dfde5b69a98ae3521e224-q1KQCC_fw1200webp");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(1000*5);//5秒,连接超时时间
        conn.setReadTimeout(1000*20);//20秒,读取超时时间
        conn.setRequestProperty("Content-Type", "application/octet-stream");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        //conn.setRequestProperty("Connection", "Keep-Alive"); // 设置为HTTP长连接
        conn.connect();

        System.out.println("connection.getResponseCode()返回的状态码:"+conn.getResponseCode());
        InputStream inputStream = conn.getInputStream(); //输入流,从中读取
        ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); //字节输出流
        byte[] buff = new byte[100]; //定义缓存字节数组
        int rc = 0;
        while ((rc = inputStream.read(buff, 0, 100)) > 0) {
            swapStream.write(buff, 0, rc); //写入字节输出流
            swapStream.flush();  // 强制持久化到存储设备,然后清空缓存
        }
        byte[] data = swapStream.toByteArray(); //toByteArray(),ByteArrayOutputStream对象 转字节数组

        map.put("inputStream", Base64.encodeBase64String(data)); //对字节数组编码为Base64字符串(String)
        return map;
    }

    public static void main(String[] args) {
        try{
            Test test=new Test();

            // 调用方法getWFile()下载文件
            Map<String, String> map = test.getWFile();
            byte[] bytes = Base64.decodeBase64(map.get("inputStream")); // 将Base64字符串解码 为byte[]数组
            ByteArrayInputStream bs = new ByteArrayInputStream(bytes); // 创建转换为ByteArrayInputStream字节数组输入流对象
            FileOutputStream out = new FileOutputStream(new File("E:\\天空之城2.jpg")); //创建文件输出流,(目标文件)

            //FileCopyUtils.copy(bs, out)是用于文件复制的方法,其中bs代表源文件的字节数据,而out代表目标文件的位置。
            // 这个方法的主要用途包括简化文件复制操作,避免编写繁琐的文件读写代码,提供高效的文件复制方法,提高文件传输的效率,并支持多种数据源和目标源的复制操作,
            // 如从输入流到输出流、从文件到文件等‌。此方法用到内存,注意JVM内存溢出问题(文件太大时)。
            FileCopyUtils.copy(bs, out);

        }catch (Exception e){
            e.printStackTrace();
        }
    }



}

示例代码2中主要增加了:

conn.setConnectTimeout(1000*5);//5秒,连接超时时间
conn.setReadTimeout(1000*20);//20秒,读取超时时间
注:两个超时设置防止网络异常或服务端异常时,导致客户端长时间连接或读取不释放,而影响客户端应用的正常运行。
main方法中使用了FileCopyUtils.copy(bs, out)是用于文件复制的方法,其中bs代表源文件的字节数据,而out代表目标文件的位置。这个方法的主要用途包括简化文件复制操作,避免编写繁琐的文件读写代码,提供高效的文件复制方法,提高文件传输的效率,并支持多种数据源和目标源的复制操作,
如从输入流到输出流、从文件到文件等‌。此方法用到内存,注意JVM内存溢出问题(文件太大时)。

说说conn.setRequestProperty("Connection", "Keep-Alive")设置:

HTTP的Keep-Alive即:保持Http长连接,底层通过保持TCP连接一段时间来达到长连接的目的。这段时间可以重复发送HTTP请求(request/response)。解决HTTP请求量大的情况。

HTTP 1.0 中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;

HTTP 1.1 中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。

一般而言客户端只设置是否启用Keep-Alive,而保持连接的控制取决于服务端(如保持连接的时长、最大连接数量等)。tomcat、weblogic等各自设置属性有不同。现在的浏览器、java8往后都是默认开启的Keep-Alive。


http://www.kler.cn/a/326041.html

相关文章:

  • PostgreSQL高可用Patroni安装(超详细)
  • 【Fargo】23:采集时间转rtp时间
  • 场景营销在企业定制开发 AI 智能名片 S2B2C 商城小程序中的应用与价值
  • 现代密码学|公钥密码体制 | RSA加密算法及其数学基础
  • Controller Baseband commands速览
  • 谷粒商城のRedisESRabbit MQ集群
  • 综合绩效考核系统源码,三级医院绩效管理系统源码,基于springboot、mybaits+avue技术开发,支持项目二开。
  • Stable Diffusion绘画 | SDXL模型的优缺点及模型推荐
  • golang学习笔记13-函数(二):init函数,匿名函数,闭包,defer
  • 第L2周:机器学习|线性回归模型 LinearRegression:2. 多元线性回归模型
  • Vulhub zico 2靶机详解
  • GS-SLAM论文阅读笔记--MM3DGS SLAM
  • A Learning-Based Approach to Static Program Slicing —— 论文笔记
  • 【Git原理与使用】分支管理
  • C++可见性
  • 关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)
  • Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)
  • linux环境oracle11.2.0.4打补丁(p31537677_112040_Linux-x86-64.zip)
  • [M贪心] lc2207. 字符串中最多数目的子序列(模拟+贪心+一次遍历+代码细节+思维)
  • 无人机避障—— 激光雷达定高北醒TF03-UART(二)
  • 【基础算法总结】分治--快排+归并
  • YOLOv8改进,YOLOv8改进损失函数采用Powerful-IoU(2024年最新IOU),助力涨点
  • 【YOLOv10改进[SPPF]】使用 SPPFCSPC替换SPPF模块 + 含全部代码和详细修改方式
  • Linux内核 -- 读写文件系统文件之kernel_read与kernel_write
  • APISIX 联动雷池 WAF 实现 Web 安全防护
  • VLAN Bond 堆叠