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)文章
SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化并解析
這篇文章主要介紹了SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
基于controller使用map接收參數(shù)的注意事項(xiàng)
這篇文章主要介紹了基于controller使用map接收參數(shù)的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
mybatis報(bào)錯(cuò)元素內(nèi)容必須由格式正確的字符數(shù)據(jù)或標(biāo)記組成異常的解決辦法
今天小編就為大家分享一篇關(guān)于mybatis查詢(xún)出錯(cuò)解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Java方法的可變參數(shù)類(lèi)型實(shí)例分析
這篇文章主要介紹了Java方法的可變參數(shù)類(lèi)型,通過(guò)實(shí)例對(duì)Java中的可變參數(shù)類(lèi)型進(jìn)行了較為深入的分析,需要的朋友可以參考下2014-09-09
解決IntelliJ IDEA創(chuàng)建spring boot無(wú)法連接http://start.spring.io/問(wèn)題
這篇文章主要介紹了解決IntelliJ IDEA創(chuàng)建spring boot無(wú)法連接http://start.spring.io/問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例
這篇文章主要介紹了使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例,2048 游戲是一款益智類(lèi)游戲,玩家需要通過(guò)合并相同數(shù)字的方塊,不斷合成更大的數(shù)字,最終達(dá)到2048,游戲規(guī)則簡(jiǎn)單,但挑戰(zhàn)性很高,需要玩家靈活運(yùn)用策略和計(jì)算能力,本文將使用Java代碼實(shí)現(xiàn),需要的朋友可以參考下2023-10-10
java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開(kāi)
這篇文章主要為大家介紹了java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開(kāi)的問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Java concurrency之鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之鎖的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

