本文档产生场景.

在项目中,由于需要一个服务做为文件中转,先定义这个中转服务为C。C服务需要将内部文件服务器(这里定义为A)的文件转移到新的文件服务器(定义为B中)。由于编程经验不足,在C中直接将A的文件读成inputStream流,然后将此inputStream流交给B。在测试环境,由于网络正常,没有出现过任何问题,或者说问题不明显,但在生产环境中,由于网络速度的不对称,造成上传文件时好时坏。以下,将些问题进行记录。

这个问题出现,会报以下错误:

Premature end of Content-Length delimited message body (expected: 11,791,936; received: 3,011,273)
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Unexpected EOF read on the socket
Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Unexpected EOF read on the socketat org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:297)at org.apache.catalina.connector.Request.parseParts(Request.java:2884)... 33 more

1. 问题代码

由于不能将所有代码都复制到这里,因此,这里的代码可以认为是半伪代码.

CloseableHttpClient httpClient = HttpClients.createDefault();
// 设置CloseableHttpClient的超时时间.
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(100000).setSocketTimeout(100000).setStaleConnectionCheckEnabled(true).setConnectTimeout(100000).build();
httpPost.setConfig(requestConfig);
// uploadUrl  这个是上传服务器,也是在前面问题说到的B服务地址.
HttpPost httpPost = new HttpPost(uploadUrl);
try {// 此部分只是一个下载地址.// 可以认为是执行下载.InputStream inputStreamTemp = 从A服务器获取的InputStream流// 将获取到的inputStreamTemp流放入BufferedInputStream.// 这一步如果只针对下载文件,可以很好的提高效率,但是如果做为一个中转,是没有办法实现的.BufferedInputStream inputStreamBuffer = new BufferedInputStream(inputStreamTemp,1024*1024*100);// 将inputStreamBuffer放入HttpEntity, 这里的代码未写全,如果需要,可根据实际情况进行写.HttpEntity reqEntity = MultipartEntityBuilder.create().addBinaryBody("file", inputStreamBuffer,ContentType.MULTIPART_FORM_DATA).build();httpPost.setEntity(reqEntity);//执行上传CloseableHttpResponse response = httpClient.execute(httpPost);
}

上面的代码,如果在测试环境,不会出任何问题,因在测试环境的网络非常好,下载和上载都有很高的速度,但是放在生产环境,A和B不在一个网段,因此,这样操作就会时不时的出现问题。

以上就是这段代码的问题所在。接下来,我们需要对这段代码进行更改,让其可以在生产环境中使用。

当然,有人会问到,为什么不先把文件下载到本地,然后再把文件上传到服务器呢?
答: 不想在中转服务器生成任何文件或临时文件,不喜欢。

2. 正常代码


CloseableHttpClient httpClient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(100000).setSocketTimeout(100000).setStaleConnectionCheckEnabled(true).setConnectTimeout(100000).build();
httpPost.setConfig(requestConfig);
HttpPost httpPost = new HttpPost(uploadUrl);
try {InputStream inputStreamTemp = 从A服务器获取的InputStream流**以上都没有作改变,所以把注释就删除了**// 创建一个ByteArrayOutputStream,用于存放复制流.ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 将从A服务器获取的InputStream流inputStreamTemp 复制到 byteArrayOutputStream流中.byte[] buffer = new byte[1024];int len;while ((len = inputStreamTemp.read(buffer)) > -1) {byteArrayOutputStream.write(buffer,0,len);}byteArrayOutputStream.flush();// 接下来,将复制的流byteArrayOutputStream转换成上传流uploadInputStreamInputStream uploadInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());// 将inputStreamBuffer放入HttpEntity, 这里的代码未写全,如果需要,可根据实际情况进行写.HttpEntity reqEntity = MultipartEntityBuilder.create().addBinaryBody("file", inputStreamBuffer,ContentType.MULTIPART_FORM_DATA).build();httpPost.setEntity(reqEntity);//执行上传CloseableHttpResponse response = httpClient.execute(httpPost);
}

以上就是流复制的简单方法,以及代码.

欢迎关注,及提问.


如果有什么问题,可以加入QQ群进行讨论。QQ群:839421316

谢谢支持。

Java.SpringBoot InputStream流复制.相关推荐

  1. java根据InputStream 流来真实判断图片格式

    java如下,这里建议不要关闭流,要不然你其他地方获取不到了 /**          * 根据文件流判断图片类型          * @param fis          * @return j ...

  2. java基础—IO流——复制一个文件到当前文件夹中

    复制一个文件到当前文件夹中 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWr ...

  3. java缓冲流 复制文件_java使用缓冲流复制文件的方法

    本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...

  4. inputstream java_Java实现inputstream流的复制

    获取到一个inputstream后,可能要多次利用它进行read的操作.由于流读过一次就不能再读了,而InputStream对象本身不能复制,而且它也没有实现Cloneable接口,所以得想点办法. ...

  5. Java IO流之【缓冲流和文件流复制文件对比】

    与文件流相比,缓冲流复制文件更快 代码: package Homework;import java.io.BufferedOutputStream; import java.io.File; impo ...

  6. 符缓冲流复制Java文件

    案例需求 把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java 实现步骤 根据数据源创建字符缓冲输入流对象 根据目的地创建字符缓冲输出流对象 读写数 ...

  7. 字符流复制Java文件改进版

    案例需求 使用便捷流对象,把模块目录下的"ConversionStreamDemo.java" 复制到模块目录下的"Copy.java" 实现步骤 根据数据源创 ...

  8. java中io流,Reader和Writer,InputStream和OutputStream,转换流 InputStreamReader 和 OutputStreamWriter

    java中所谓流通俗来讲就是数据源的传输,我们的文件,视屏,对象都可以叫做数据源,io将他们那转换为可以在不同程序中传输的数据,众所周知电脑存储是二进制,而处理时常遇到字节和字符的写入和写出,分别以8 ...

  9. java io流复制文件简单实例

    java io流复制文件简单实例 实例1: package com.io;import java.io.BufferedInputStream; import java.io.BufferedOutp ...

最新文章

  1. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...
  2. python定时器每月执行一次_python 定时器,实现每天凌晨3点执行的方法
  3. C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常
  4. Yii的路由机制分析
  5. 分享一个有趣的网站“让我帮你百度一下“
  6. mpvue中使用小程序云开发总结
  7. Flutter之Widget 更新机制updateChild原理浅析
  8. git version可以卸载吗_「玩转Git命令」作为代码奴,该安装Git啦
  9. jQuery操作input值总结
  10. html5在线拍照,h5调用html5拍照上传功能
  11. Verilog学习——T触发器
  12. 最快的 Hexo 博客搭建方法
  13. A Cleaned, Hypernymed, Image Alt-text Dataset For Automatic Image CaptioningTransformer
  14. 增删改查以及冒泡算法的综合案例
  15. 使用Jhon工具破解Windows密码
  16. 用神经网络实现语音分类
  17. 【转】OrCAD 16.3安装和破解方法
  18. EasyExcel 实现模板导出、模板导入分析功能
  19. AutoCAD 2007官方.NET教程(一)(C#版)
  20. 转转集团品牌战略升级:更换新LOGO,1亿美元战投红布林

热门文章

  1. ElasticSearch 7 权威指南(一)什么是Elasticsearch ?
  2. 曲线提取数据Engauge Digitizer
  3. 模型设计有趣软件学习
  4. 关于酷柚易汛进销存开源版订货通操作说明
  5. 如何在Solr中更好的处理同义词
  6. VRF技术-原理简介
  7. javascript面试题(javaScript面试题)
  8. pdxp协议 C语言,一文看懂PD协议和Type-C的区别
  9. 基于JAVA超市会员积分管理系统计算机毕业设计源码+系统+lw文档+部署
  10. fultter项目运行报错,Android不兼容问题