java接收文件流+response.body()調用兩次問題(分別接收文件和對象)
java接收文件流+response.body()調用兩次
正常返回的數(shù)據(jù)是流 可以讀成圖片 但是異常的時候返回的是對象(字段) 這種時候需要判斷情況,就是說分別獲取流文件的對象信息,而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];
// 讀取到的數(shù)據(jù)長度
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("程序執(zhí)行完畢");
}關于OKHttpUtils,連續(xù)調用Response.body()報錯io.closed的坑
當我調用
inputStream = response.body().byteStream();時報錯io異常的closed錯誤

經過問題排查,發(fā)現(xiàn)我在工具類里面寫了
log.info("請求返回內容為{}",response.body().string());這里雖然調用的是string()方法,但是由于body()調用一次就會導致后面獲取輸入流時流關閉,即okhttp3只允許調用response.body()一次,因為響應體可能很大,所以OkHttp沒有存入響應體到內存,只是作為流從網(wǎng)絡中讀取。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring實戰(zhàn)之Bean的作用域request用法分析
這篇文章主要介紹了Spring實戰(zhàn)之Bean的作用域request用法,結合實例形式分析了spring中Bean的request作用域相關使用技巧與操作注意事項,需要的朋友可以參考下2019-11-11
mybatis對象List<String> List<Integer>屬性映射方式
這篇文章主要介紹了mybatis對象List<String> List<Integer>屬性映射方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java并發(fā)編程之ReentrantLock可重入鎖的實例代碼
這篇文章主要介紹了Java并發(fā)編程之ReentrantLock可重入鎖的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02

