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

记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 统…...

物联网实训室建设的必要性

物联网实训室建设的必要性 一、物联网发展的背景 物联网&#xff08;IoT&#xff09;是指通过信息传感设备&#xff0c;按照约定的协议&#xff0c;将任何物品与互联网连接起来&#xff0c;进行信息交换和通信&#xff0c;以实现智能化识别、定位、跟踪、监控和管理的一种网络…...

初识C语言(四)

目录 前言 十一、常见关键字&#xff08;补充&#xff09; &#xff08;1&#xff09;register —寄存器 &#xff08;2&#xff09;typedef类型重命名 &#xff08;3&#xff09;static静态的 1、修饰局部变量 2、修饰全局变量 3、修饰函数 十二、#define定义常量和宏…...

产品架构图:从概念到实践

在当今快速发展的科技时代&#xff0c;产品架构图已成为产品经理和设计师不可或缺的工具。它不仅帮助我们理解复杂的产品体系&#xff0c;还能指导我们进行有效的产品设计和开发。本文将深入探讨产品架构图的概念、重要性以及绘制方法。 整个内容框架分为三个部分&#xff0c;…...

smartctl 命令:查看硬盘健康状态

一、命令简介 ​smartctl​ 命令用于获取硬盘的 SMART 信息。 介绍硬盘SMART 硬盘的 SMART (Self-Monitoring, Analysis, and Reporting Technology) 技术用于监控硬盘的健康状态&#xff0c;并能提供一些潜在故障的预警信息。通过查看 SMART 数据&#xff0c;用户可以了解硬…...

BBR 为什么没有替代 CUBIC 成为 Linux 内核缺省算法

自 2017 年底 bbr 发布以来&#xff0c;随着媒体的宣讲&#xff0c;各大站点陆续部署 bbr&#xff0c;很多网友不禁问&#xff0c;bbr 这么好&#xff0c;为什么不替代 cubic 成为 linux 的缺省算法。仅仅因为它尚未标准化&#xff1f;这么好的算法又为什么没被标准化&#xff…...

Git忽略规则原理和.gitignore文件不生效的原因和解决办法

在使用Git进行版本控制时&#xff0c;.gitignore文件扮演着至关重要的角色。它允许我们指定哪些文件或目录应该被Git忽略&#xff0c;从而避免将不必要的文件&#xff08;如日志文件、编译产物等&#xff09;纳入版本控制中。然而&#xff0c;在实际使用过程中&#xff0c;有时…...

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…...

Unity开发绘画板——04.笔刷大小调节

笔刷大小调节 上面的代码中其实我们已经提供了笔刷大小的字段&#xff0c;即brushSize&#xff0c;现在只需要将该字段和界面中的Slider绑定即可&#xff0c;Slider值的范围我们设置为1~20 代码中只需要做如下改动&#xff1a; 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_…...

数学建模研赛总结

目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录&#xff0c;希望所写的一些内容能够对大家有所帮助&#xff0c;不足之处欢迎大家批评指正&#x1f91d;&#x1f91d;&#x1f91d; 进度 今天已经是最后一天了&#xf…...

通信工程学习:什么是TCF技术控制设施

TCF&#xff08;Technical Control Facility&#xff09;&#xff1a;技术控制设施 首先&#xff0c;需要明确的是&#xff0c;通信工程是一门涉及电子科学与技术、信息与通信工程和光学工程学科领域的基础理论、工程设计及系统实现技术的学科。它主要关注通信过程中的信息传输…...

stm32 bootloader跳转程序设计

文章目录 1、bootloader跳转程序设计&#xff08;1&#xff09;跳转程序&#xff08;2&#xff09;、app程序中需要注意<1>、在keil中ROM起始地址和分配的空间大小<2>、在system_stm32f4xx.c中设置VECT_TAB_OFFSET为需要偏移的地址<3>、main函数中使能中断 总…...

科技赋能环保:静电与光解技术在油烟净化中的卓越应用

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着环保政策的不断升级&#xff0c;餐饮行业的油烟治理成为重要课题。油烟净化器的技术革新不仅提升了净化效率&#xff0c;…...

FCA-FineBI试卷答案

1、【判断题】FineBI数据加工建模中只支持文本、数值、日期三种数据类型。 正确答案&#xff1a;A A. 正确 B. 错误 2、【判断题】Excel 支持批量导入&#xff0c;可以一次导入多个 sheet 或 Excel&#xff1f; 正确答案&#xff1a;A A.正确 B. 错误 3、【判断题】FineBI V6.…...

Spring - @Import注解

文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…...

新能源汽车储充机器人:能源高效与智能调度

新能源汽车储充机器人&#xff1a;开启能源高效利用与智能调度的未来之门 随着全球能源危机的日益加剧和环境污染问题的不断恶化&#xff0c;新能源汽车成为了未来交通领域的重要发展方向。然而&#xff0c;新能源汽车的普及不仅需要解决电池技术的瓶颈&#xff0c;还需要构建一…...

【Linux网络】详解TCP协议(2)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux网络 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 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中断状态寄存器&#xff08;DMA_ISR&#xff09;4.2 DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09;…...

【高性能内存池】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是一样的&#xff0c;都是哈希桶的结构&#xff0c;并且挂载的…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...