记HttpURLConnection下载图片

devtools/2024/10/9 4:12:11/

目录

一、示例代码1

二、示例代码2


一、示例代码1

java">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

java">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。


http://www.ppmy.cn/devtools/123183.html

相关文章

如何使用ssm实现基于Java的民宿预订管理系统的设计与实现

TOC ssm773基于Java的民宿预订管理系统的设计与实现jsp 绪论 1.1课题研究背景意义 随着科技的发展&#xff0c;计算机的应用&#xff0c;人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷&#xff0c;网络也遍及到我们生活的每个角落&#x…

面试题:Redis(一)

1. redis是单线程还是多线程&#xff1f; 2. IO多路复用听说过么&#xff1f; 3. Redis为什么快&#xff1f; 1. Redis是单线程还是多线程&#xff1f; 版本不同&#xff0c;Redis基于的架构也不同&#xff0c;所以单单问是单还是多线程并不严谨 3.x 之前 redis都是单线程 4.x …

Linux文件属性

Linux 文件基本属性 为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限&#xff1a; - chown (change owner) &#…

算法打卡:第十一章 图论part11

今日收获&#xff1a;Floyd 算法&#xff0c;A * 算法&#xff0c;最短路算法总结 1. Floyd 算法 题目链接&#xff1a;97. 小明逛公园 思路&#xff1a;Floyd用于解决多源最短路问题&#xff0c;对边的正负权值没有要求。核心是动态规划 &#xff08;1&#xff09;dp数组的…

python爬虫 - 进阶requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 &#xff08;一&#xff09;跳过 SSL 证书验证 &#xff0…

《CTF 特训营》:网络安全竞赛的进阶指南

在网络安全领域日益受到重视的今天&#xff0c;CTF&#xff08;Capture The Flag&#xff09;竞赛作为一种检验和提升网络安全技能的方式&#xff0c;受到了越来越多爱好者的关注。而《CTF 特训营》这本书&#xff0c;无疑是一本帮助读者深入了解 CTF 竞赛的优秀读物。 一、书籍…

通过JS + PHP实现简易小说采集

先申明下&#xff0c;这个只是用来作为采集的一个样本&#xff0c;请大家还是尊重知识产权&#xff0c;看正版的书籍。 一、简要说明&#xff1a; 主要用到&#xff1a;jQuery, PHP 主要思路&#xff1a; 1. 通过js来循环访问本地的php文件&#xff0c;并传输书本网址&#xf…

【计算机网络】Tcp/IP五层协议,Udp报文组成,Udp与Tcp的区别

Tcp/IP五层协议 TCP/IP模型是计算机网络的核心协议之一&#xff0c;通常被分为五层&#xff0c;每一层都有其独特的功能和作用。以下是TCP/IP模型的五层协议的简要描述&#xff1a; 物理层&#xff1a;这一层涉及实际的物理连接&#xff0c;定义了硬件传输介质的特性&#xff…