文件下载出现 IOExpcetion: closed

异常原因截图 :

异常代码位置 :

出现的原因是  使用 try-with-resources,  downloadFile 方法执行完毕, 文件流被关闭了...导致前面读取文件字节, 异常提示已经关闭...

try (Response response = OkHttpUtils.getInstance().client.newCall(new Request.Builder().url(fileUrl).build()).execute()) {

正确的写法是 : 

不使用 try-with-resources, 使用常规写法, 所以说 try-with-resources 这个语法虽然方便, 但使用起来也要注意代码上下文

    /**
     * 根据资源网络url下载文件
     *
     * @param fileUrl
     * @return
     */
    public static InputStream downloadFile(String fileUrl) {
        try {
            Response response = OkHttpUtils.getInstance().client.newCall(new Request.Builder().url(fileUrl).build()).execute();
            Assert.notNull(response, "http request error");
            Assert.isTrue(response.isSuccessful(), "http request not successful");
            ResponseBody body = response.body();
            Assert.notNull(body, "http request error");
            return body.byteStream();
        } catch (Exception e) {
            log.error("http download file error, ", e);
            throw new RuntimeException("http error.");
        }
    }

附上 OkHttpUtils 工具类, 单例实现的

package com.ckx.pricing.third.common.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.util.Assert;

import java.io.InputStream;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

/**
 * @author yukun.yan
 * @description OkHttpUtils
 * @date 2023/5/29 11:38
 */
@Slf4j
public class OkHttpUtils {

    private final OkHttpClient client;

    private static final ObjectMapper objectMapper = new ObjectMapper();

    public OkHttpUtils() {
        client = new OkHttpClient.Builder()
                .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool(10, 20, TimeUnit.MINUTES))
                .build();
    }

    /**
     * 执行一个http请求, 返回 响应数据
     *
     * @param request
     * @return
     */
    public static String newCall(Request request) {
        if (request == null) {
            throw new IllegalArgumentException("Request cannot be null");
        }
        try (Response response = OkHttpUtils.getInstance().client.newCall(request).execute()) {
            Assert.notNull(response, "http request error");
            Assert.isTrue(response.isSuccessful(), "http request not successful");
            ResponseBody body = response.body();
            Assert.notNull(body, "http request error");
            return body.string();
        } catch (Exception e) {
            throw new RuntimeException("http error.");
        }
    }

    /**
     * 入参解析为请求入参
     *
     * @param object
     * @param <T>
     * @return
     */
    public static <T> RequestBody toPostRequestBody(T object) {
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonRequestBody = null;
        try {
            jsonRequestBody = objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            log.error("request json error, ", e);
        }
        Assert.notNull(jsonRequestBody, "request not be null");
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        return RequestBody.create(JSON, jsonRequestBody);
    }

    /**
     * 对网络请求返回值解析, 解密标椎json格式
     *
     * @param jsonResp
     * @param tClass
     * @param <T>
     * @return
     */
    public static <T> T readResponseValue(String jsonResp, Class<T> tClass) {
        try {
            return objectMapper.readValue(jsonResp, tClass);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("response to json error");
        }
    }

    /**
     * 根据资源网络url下载文件
     *
     * @param fileUrl
     * @return
     */
    public static InputStream downloadFile(String fileUrl) {
        try {
            Response response = OkHttpUtils.getInstance().client.newCall(new Request.Builder().url(fileUrl).build()).execute();
            Assert.notNull(response, "http request error");
            Assert.isTrue(response.isSuccessful(), "http request not successful");
            ResponseBody body = response.body();
            Assert.notNull(body, "http request error");
            return body.byteStream();
        } catch (Exception e) {
            log.error("http download file error, ", e);
            throw new RuntimeException("http error.");
        }
    }

    private static class OkHttpUtilsInstanceOwner {

        private static final OkHttpUtils INSTANCE = new OkHttpUtils();

    }

    /**
     * 返回该类的单例对象, 并自动初始化构造器
     *
     * @return
     */
    public static OkHttpUtils getInstance() {
        return OkHttpUtilsInstanceOwner.INSTANCE;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/604145.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Yolov8实现loopy视频识别

1、前言 loopy是一个非常可爱的动漫角色&#xff08;可爱粉色淀粉肠&#xff09;&#xff0c;闲来无事&#xff0c;打算用yolov8训练一个模型对loopy进行识别。 2、准备工作 先在网络上搜寻很多loopy的图片&#xff0c;然后将图片导入Lablel Studio软件进行标注&#xff0c;并…

第1章.STM32单片机入门知识介绍

目录 0. 《STM32单片机自学教程》专栏 1.1 嵌入式系统简介 1.1.1 什么是嵌入式系统 1.1.2 嵌入式系统的特点 1.1.3 嵌入式系统的应用领域 1.2 单片机基本概念 1.3 ARM简介 1.3.1 ARM公司简介 1.3.2 ARM处理器简介 1.4 STM32简介 1.4.1 基于Cortex内核的MCU 1.4.…

springMVC入门学习

目录 1、 什么是springmvc 2、springmvc工作流程 3、 springmvc快速入门&#xff08;XML版本&#xff09; 4、加载自定义目录下的springmvc.xml配置文件 5、 解析器InternalResourceViewResolver 6、 映射器BeanNameUrlHandlerMapping 7、 适配器SimpleControllerHandle…

【算法-程序的灵魂#谭浩强配套】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a; 1.一个程序主要包括以下两方面信息&#xff1a;程…

React:Router-1.BrowserRouter组件式

使用步骤 安装 react-router-dom 依赖 $ npm install react-router-dom6导入 BrowserRouter, Link, Routes, Route 对象 import {BrowserRouter, Link, Routes, Route} from react-router-dom;3.BrowserRouter&#xff1a;history模式路由&#xff1b; HashRouter&#xff1…

Flask gevent启动报错UnicodeDecodeError

文章目录 环境代码报错Track解决思路 环境 acondana 24.1.2python 3.7.13 32bitflask 2.2.3gevent 21.8.0 代码 port 7236 logging.basicConfig(levellogging.INFO, # 控制台打印的日志级别filename./logs/app.log, # 将日志写入log_new.log文件中filemodea, # 模式&…

python笔记:dataclass

1 引子&#xff1a;其他类似实现方法的局限性 假设我们现在需要实现这样的内容&#xff1a; nameChinaarea960population140967 1.1 tuple/list country1_tuple(China,960,140967) country1_tuple[0] #China 缺点&#xff1a;需要记住各个属性是list/tuple第几位的属性&am…

DEV--C++小游戏(吃星星(0.2))

目录 吃星星&#xff08;0.2&#xff09; 简介 分部代码 头文件&#xff08;增&#xff09; 命名空间变量&#xff08;增&#xff09; 副函数&#xff08;新&#xff0c;增&#xff09; 清屏函数 打印地图函数&#xff08;增&#xff09; 移动函数 选择颜色&#xff…

LuaJIT源码分析(三)字符串

LuaJIT源码分析&#xff08;三&#xff09;字符串 要表示一个字符串&#xff0c;核心就是需要知道字符串的长度&#xff0c;以及存放字符串具体数据的地址。lua的字符串是内化不可变的&#xff0c;也就是lua字符串变量存放的不是字符串的拷贝&#xff0c;而是字符串的引用。那么…

OpenNJet产品体验-手把手在Ubuntu20.04系统从零部署到应用OpenNJet

目录 一、引言 二、OpenNJet产品安装 2.1下载OpenNJet安装包 2.2安装OpenNJet V2.0.1 ​2.3快速启动并测试OpenNJet 三、OpenNJet产品应用体验 3.1配置OpenNJet 3.2 部署 Web 应用程序 3.3启动 NJet 3.4访问 Web 应用程序 四、总结 一、引言 OpenNJet应用引擎是高性…

代码随想录算法训练营DAY47|C++动态规划Part8|198.打家劫舍、213.打家劫舍II、198.打家劫舍III

文章目录 198.打家劫舍思路CPP代码 ⭐️213.打家劫舍II解决环的问题思路总结CPP代码 ⭐️198.打家劫舍III思路递归三部曲——确定参数和返回值递归三部曲——确定终止条件递归三部曲——确定单层遍历的逻辑 打印dp数组CPP代码暴力递归记忆化递归 198.打家劫舍 力扣题目链接 文章…

小米手机怎么截屏?一篇文章教会你!

我们经常需要截取手机屏幕上的内容&#xff0c;无论是为了分享、教学还是记录。对于小米手机用户来说&#xff0c;掌握截屏技巧不仅能够方便地记录精彩瞬间&#xff0c;还能在需要时轻松分享或保存屏幕内容。小米手机怎么截屏&#xff0c;有哪些截屏方式呢&#xff1f;本文将为…

Remix中使用 Tailwind

如何Remix 中使用 Tailwindcss Remix是通过 Vite 进行构建的&#xff0c;Vite 原生就支持 PostCSS&#xff0c;通过以下几步就可以设置完成 安装 PostCSS 插件 npm install -D tailwindcss autoprefixer添加PostCSS配置文件 ## postcss.config.js export default {plugins:…

深度学习网络:设计、开发和部署

​书籍&#xff1a;Deep Learning Networks: Design, Development and Deployment 作者&#xff1a;Jayakumar Singaram&#xff0c;S. S. Iyengar&#xff0c;Azad M. Madni 出版&#xff1a;Springer书籍下载-《​深度学习网络&#xff1a;设计、开发和部署》该教材为学生和工…

cesium雷达遮罩(轨迹球效果)

cesium 雷达遮罩(轨迹球效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、代码示例 2.1 index.html <!DOCTYPE html> <html lang="en"><head><!

【刷题篇】双指针(二)

文章目录 1、有效三角形的个数2、查找总价格为目标值的两个商品3、三数之和4、四数之和 1、有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 class Solution { public:int triangleNumber(vector<int>& n…

u盘数据突然不见了怎么回事 u盘数据为什么无故不见如何恢复

当我们把文档资料保存好并复制到U盘后&#xff0c;发现刚才保存的资料没了&#xff0c;并且连文档都不见了&#xff0c;不过文件夹还在U盘。那么U盘数据突然不见了怎么回事呢?U盘数据突然不见了怎么办? 一、U盘数据突然不见了怎么回事 有许多原因可能导致u盘数据无故消失&a…

伪装目标检测论文阅读之Dual-SAM(CVPR-2024)

论文&#xff1a;link code&#xff1a;code Fantastic Animals and Where to Find Them:Segment Any Marine Animal with Dual SAM 摘要 作为水下智能的重要支柱&#xff0c;海洋动物分割(MAS)涉及对海洋环境中的动物进行分割。以往的方法在提取长范围上下文特征方面表现不佳…

内存卡突然罢工?数据恢复有高招!

内存卡作为我们日常生活中常见的存储设备&#xff0c;广泛应用于手机、相机等设备中。然而&#xff0c;有时我们会遇到内存卡损坏打不开的情况&#xff0c;这时该如何应对呢&#xff1f;本文将为您详细解析内存卡损坏的原因&#xff0c;并提供有效的数据恢复方案&#xff0c;帮…

PyQt5的基本安装与使用

文章目录 1. 简介2.安装2.1.QtDisigner配置2.2 PyUIC配置2.3. PyRCC配置 3. 一个简单的PyQt5使用示例 1. 简介 PyQt5是一个用于创建交互式界面的Python库&#xff0c;它是基于Qt框架的Python绑定。Qt是一个跨平台的C框架&#xff0c;用于开发图形用户界面&#xff08;GUI&…
最新文章