java接收文件流+response.body()調(diào)用兩次問(wèn)題(分別接收文件和對(duì)象)
java接收文件流+response.body()調(diào)用兩次
正常返回的數(shù)據(jù)是流 可以讀成圖片 但是異常的時(shí)候返回的是對(duì)象(字段) 這種時(shí)候需要判斷情況,就是說(shuō)分別獲取流文件的對(duì)象信息,而Response.body()這個(gè)只能用一次
所以推出這個(gè)解決方法
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]; // 讀取到的數(shù)據(jù)長(zhǎng)度 int len; // 輸出的文件流(后綴名) File sf=new File("F://文件接收"); if(!sf.exists()){ sf.mkdirs(); } // 新的圖片文件名 = 編號(hào) +"."圖片擴(kuò)展名 OutputStream os = new FileOutputStream(sf.getPath()+"\\"+sf.getName()); // 開(kāi)始讀取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完畢,關(guān)閉所有鏈接 os.close(); is.close(); System.out.println("程序執(zhí)行完畢"); }
關(guān)于OKHttpUtils,連續(xù)調(diào)用Response.body()報(bào)錯(cuò)io.closed的坑
當(dāng)我調(diào)用
inputStream = response.body().byteStream();時(shí)報(bào)錯(cuò)io異常的closed錯(cuò)誤
經(jīng)過(guò)問(wèn)題排查,發(fā)現(xiàn)我在工具類(lèi)里面寫(xiě)了
log.info("請(qǐng)求返回內(nèi)容為{}",response.body().string());
這里雖然調(diào)用的是string()方法,但是由于body()調(diào)用一次就會(huì)導(dǎo)致后面獲取輸入流時(shí)流關(guān)閉,即okhttp3只允許調(diào)用response.body()一次,因?yàn)轫憫?yīng)體可能很大,所以O(shè)kHttp沒(méi)有存入響應(yīng)體到內(nèi)存,只是作為流從網(wǎng)絡(luò)中讀取。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring實(shí)戰(zhàn)之Bean的作用域request用法分析
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean的作用域request用法,結(jié)合實(shí)例形式分析了spring中Bean的request作用域相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-11-11mybatis對(duì)象List<String> List<Integer>屬性映射方式
這篇文章主要介紹了mybatis對(duì)象List<String> List<Integer>屬性映射方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java并發(fā)編程之ReentrantLock可重入鎖的實(shí)例代碼
這篇文章主要介紹了Java并發(fā)編程之ReentrantLock可重入鎖的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Java模擬實(shí)現(xiàn)HashMap算法流程詳解
在java開(kāi)發(fā)中,HashMap是最常用、最常見(jiàn)的集合容器類(lèi)之一,文中通過(guò)示例代碼介紹HashMap為啥要二次Hash,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02Spring AI內(nèi)置DeepSeek的詳細(xì)步驟
Spring AI 最新快照版已經(jīng)內(nèi)置 DeepSeek 了,所以以后項(xiàng)目中對(duì)接 DeepSeek 就方便多了,但因?yàn)榭煺瞻鏁?huì)有很多 Bug,所以今天咱們就來(lái)看穩(wěn)定版的 Spring AI 如何對(duì)接 DeepSeek 滿血版,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-02-02