java接收文件流+response.body()调用两次问题(分别接收文件和对象)

 更新时间:2023年06月17日 14:48:48   作者:dalter  
这篇文章主要介绍了java接收文件流+response.body()调用两次问题(分别接收文件和对象),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java接收文件流+response.body()调用两次

正常返回的数据是流 可以读成图片 但是异常的时候返回的是对象(字段) 这种时候需要判断情况,就是说分别获取流文件的对象信息,而Response.body()这个只能用一次

所以推出这个解决方法

import okhttp3.*;
import okio.Buffer;
import okio.BufferedSource;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;    
public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        Request request = new Request.Builder()
                .url("http://127.0.0.1:8080/test/duizhang")
                .build();
        Response response = client.newCall(request).execute();
        ResponseBody body = response.body();
        BufferedSource source = body.source();
        source.request(Long.MAX_VALUE);
        Buffer buffer = source.buffer();
        String responseBodyString = buffer.clone().readString(Charset.forName("UTF-8"));
        System.out.println(responseBodyString);
        InputStream is = body.byteStream();
        byte[] bs = new byte[1024];
        // 读取到的数据长度
        int len;
        // 输出的文件流(后缀名)
        File sf=new File("F://文件接收");
        if(!sf.exists()){
            sf.mkdirs();
        }
        // 新的图片文件名 = 编号 +"."图片扩展名
        OutputStream os = new FileOutputStream(sf.getPath()+"\\"+sf.getName());
        // 开始读取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        // 完毕,关闭所有链接
        os.close();
        is.close();
        System.out.println("程序执行完毕");
    }

关于OKHttpUtils,连续调用Response.body()报错io.closed的坑

当我调用

inputStream = response.body().byteStream();时报错io异常的closed错误

经过问题排查,发现我在工具类里面写了

log.info("请求返回内容为{}",response.body().string());

这里虽然调用的是string()方法,但是由于body()调用一次就会导致后面获取输入流时流关闭,即okhttp3只允许调用response.body()一次,因为响应体可能很大,所以OkHttp没有存入响应体到内存,只是作为流从网络中读取。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Spring实战之Bean的作用域request用法分析

    Spring实战之Bean的作用域request用法分析

    这篇文章主要介绍了Spring实战之Bean的作用域request用法,结合实例形式分析了spring中Bean的request作用域相关使用技巧与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • mybatis对象List<String> List<Integer>属性映射方式

    mybatis对象List<String> List<Integer>属性映射方式

    这篇文章主要介绍了mybatis对象List<String> List<Integer>属性映射方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java并发编程之ReentrantLock可重入锁的实例代码

    Java并发编程之ReentrantLock可重入锁的实例代码

    这篇文章主要介绍了Java并发编程之ReentrantLock可重入锁的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • zookeeper watch机制的理解

    zookeeper watch机制的理解

    这篇文章主要介绍了zookeeper watch机制的相关内容,内容比较详细,需要的朋友可以参考下。
    2017-09-09
  • Spring Boot 快速集成 Redis的方法

    Spring Boot 快速集成 Redis的方法

    这篇文章主要介绍了Spring Boot 如何快速集成 Redis,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java模拟实现HashMap算法流程详解

    Java模拟实现HashMap算法流程详解

    在java开发中,HashMap是最常用、最常见的集合容器类之一,文中通过示例代码介绍HashMap为啥要二次Hash,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Spring AI内置DeepSeek的详细步骤

    Spring AI内置DeepSeek的详细步骤

    Spring AI 最新快照版已经内置 DeepSeek 了,所以以后项目中对接 DeepSeek 就方便多了,但因为快照版会有很多 Bug,所以今天咱们就来看稳定版的 Spring AI 如何对接 DeepSeek 满血版,感兴趣的小伙伴跟着小编一起来看看吧
    2025-02-02
  • springmvc中下载中文文件名称为下划线的解决方案

    springmvc中下载中文文件名称为下划线的解决方案

    这篇文章主要介绍了springmvc中下载中文文件名称为下划线的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • JPA中EntityListeners注解的使用详解

    JPA中EntityListeners注解的使用详解

    这篇文章主要介绍了JPA中EntityListeners注解的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Java NIO实战之多人聊天室

    Java NIO实战之多人聊天室

    这篇文章主要为大家详细介绍了Java NIO实战之多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论