java接收文件流+response.body()调用两次问题(分别接收文件和对象)
作者: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没有存入响应体到内存,只是作为流从网络中读取。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。