记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个字节,读到文件末尾返回-1fOutStream.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 {// 定义mapMap<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。
相关文章:
记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 统…...
物联网实训室建设的必要性
物联网实训室建设的必要性 一、物联网发展的背景 物联网(IoT)是指通过信息传感设备,按照约定的协议,将任何物品与互联网连接起来,进行信息交换和通信,以实现智能化识别、定位、跟踪、监控和管理的一种网络…...
初识C语言(四)
目录 前言 十一、常见关键字(补充) (1)register —寄存器 (2)typedef类型重命名 (3)static静态的 1、修饰局部变量 2、修饰全局变量 3、修饰函数 十二、#define定义常量和宏…...
产品架构图:从概念到实践
在当今快速发展的科技时代,产品架构图已成为产品经理和设计师不可或缺的工具。它不仅帮助我们理解复杂的产品体系,还能指导我们进行有效的产品设计和开发。本文将深入探讨产品架构图的概念、重要性以及绘制方法。 整个内容框架分为三个部分,…...
smartctl 命令:查看硬盘健康状态
一、命令简介 smartctl 命令用于获取硬盘的 SMART 信息。 介绍硬盘SMART 硬盘的 SMART (Self-Monitoring, Analysis, and Reporting Technology) 技术用于监控硬盘的健康状态,并能提供一些潜在故障的预警信息。通过查看 SMART 数据,用户可以了解硬…...
BBR 为什么没有替代 CUBIC 成为 Linux 内核缺省算法
自 2017 年底 bbr 发布以来,随着媒体的宣讲,各大站点陆续部署 bbr,很多网友不禁问,bbr 这么好,为什么不替代 cubic 成为 linux 的缺省算法。仅仅因为它尚未标准化?这么好的算法又为什么没被标准化ÿ…...
Git忽略规则原理和.gitignore文件不生效的原因和解决办法
在使用Git进行版本控制时,.gitignore文件扮演着至关重要的角色。它允许我们指定哪些文件或目录应该被Git忽略,从而避免将不必要的文件(如日志文件、编译产物等)纳入版本控制中。然而,在实际使用过程中,有时…...
MySQL-数据库设计
1.范式 数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数 据库,这些不同的规范要求被称为不同的范式。 关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(…...
Unity开发绘画板——04.笔刷大小调节
笔刷大小调节 上面的代码中其实我们已经提供了笔刷大小的字段,即brushSize,现在只需要将该字段和界面中的Slider绑定即可,Slider值的范围我们设置为1~20 代码中只需要做如下改动: public Slider brushSizeSlider; //控制笔刷大…...
./mnt/container_run_medium.sh
#!/bin/bash# 清理旧的日志文件 rm -f *.log rm -f nohup.out rm -f cssd.dat# 启动 pwbox_simu 和 MediumBoxBase nohup /mnt/simutools/pwbox_simu /mnt/simutools/pw_box.conf > /dev/null 2>&1 & nohup /mnt/mediumSimu/MediumBoxBase /mnt/mediumSimu/hynn_…...
数学建模研赛总结
目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录,希望所写的一些内容能够对大家有所帮助,不足之处欢迎大家批评指正🤝🤝🤝 进度 今天已经是最后一天了…...
通信工程学习:什么是TCF技术控制设施
TCF(Technical Control Facility):技术控制设施 首先,需要明确的是,通信工程是一门涉及电子科学与技术、信息与通信工程和光学工程学科领域的基础理论、工程设计及系统实现技术的学科。它主要关注通信过程中的信息传输…...
stm32 bootloader跳转程序设计
文章目录 1、bootloader跳转程序设计(1)跳转程序(2)、app程序中需要注意<1>、在keil中ROM起始地址和分配的空间大小<2>、在system_stm32f4xx.c中设置VECT_TAB_OFFSET为需要偏移的地址<3>、main函数中使能中断 总…...
科技赋能环保:静电与光解技术在油烟净化中的卓越应用
我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着环保政策的不断升级,餐饮行业的油烟治理成为重要课题。油烟净化器的技术革新不仅提升了净化效率,…...
FCA-FineBI试卷答案
1、【判断题】FineBI数据加工建模中只支持文本、数值、日期三种数据类型。 正确答案:A A. 正确 B. 错误 2、【判断题】Excel 支持批量导入,可以一次导入多个 sheet 或 Excel? 正确答案:A A.正确 B. 错误 3、【判断题】FineBI V6.…...
Spring - @Import注解
文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…...
新能源汽车储充机器人:能源高效与智能调度
新能源汽车储充机器人:开启能源高效利用与智能调度的未来之门 随着全球能源危机的日益加剧和环境污染问题的不断恶化,新能源汽车成为了未来交通领域的重要发展方向。然而,新能源汽车的普及不仅需要解决电池技术的瓶颈,还需要构建一…...
【Linux网络】详解TCP协议(2)
🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 TCP协议的三次握手和四次挥手 的相关内容。 如果看到最后您觉得…...
STM32DMA学习日记
STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器(DMA_ISR)4.2 DMA中断标志清除寄存器(DMA_IFCR)…...
【高性能内存池】page cache 5
page cache 1 page cache的框架2 central cache从page cache申请n页span的过程3 page cache 的结构3.1 page cache类框架3.2 central cache向page cache申请span3.3 获取k页的span page cache的结构和central cache是一样的,都是哈希桶的结构,并且挂载的…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
