本文档产生场景.

在项目中,由于需要一个服务做为文件中转,先定义这个中转服务为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. 40万总奖金!院士指导,顶级云服务免费用!2021全球高性能云计算创新大赛来了...
  2. oracle 关系 表 视图_oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系
  3. UNIX再学习 -- 线程控制
  4. 科研地图来了,看看你的研究领域在哪里!中国科学院科技战略咨询研究院发布《科学结构图谱2021》
  5. java 多网卡ip_java获取双网卡ip地址
  6. Mongo Windows 基本使用入门
  7. 《天下无贼》经典对白
  8. 面向对象(类/对象/封装/继承/static/内存类加载)
  9. PyTorch 1.0 中文官方教程:使用字符级别特征的 RNN 网络进行姓氏分类
  10. c语言转职,魔兽地图:3C转职版5.0C
  11. 玩转python网络爬虫-清华大学出版社-图书详情-《玩转Python网络爬虫》
  12. python表白代码-python告白代码,只属于程序员的浪漫
  13. 淘宝商城事件:中小卖家缺失的互联网信任
  14. 魅族17用鸿蒙系统,发布一年还很香,魅族17升级Flyme 9后太好用了
  15. oracle 两表关联查询
  16. 游戏对战平台研究终结
  17. 9、Linux文本处理三剑客之sed命令
  18. 帝国霸略老显示服务器连接失败,帝国霸略怎么玩?新手必看技巧攻略[图]
  19. oracle获取每月的第一天和最后一天
  20. 分布式理论分布式ID生成大全

热门文章

  1. matlab梁结点,用matlab编程对无限梁设计
  2. ARM/X86/PowerPC/MIPS
  3. TensorSpace:一套用于构建神经网络3D可视化应用的框架
  4. 不安分的 Go 语言开始入侵 Web 前端领域了!
  5. 怎么显示文件扩展名即后缀
  6. 3D视图生成器PS插件汉化版 Isometrical-3D View Generator-Photoshop Plugin
  7. 最新苏州大学计算机系宿舍,2020年苏州大学新生宿舍环境条件,大一新生男生女生宿舍内部图片【多图】...
  8. chatroom-login/register笔记
  9. 双语矩阵论课程笔记(1)—— 常用术语翻译
  10. 敏捷软件开发模型--SCRUM