Java.SpringBoot InputStream流复制.
本文档产生场景.
在项目中,由于需要一个服务做为文件中转,先定义这个中转服务为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流复制.相关推荐
- java根据InputStream 流来真实判断图片格式
java如下,这里建议不要关闭流,要不然你其他地方获取不到了 /** * 根据文件流判断图片类型 * @param fis * @return j ...
- java基础—IO流——复制一个文件到当前文件夹中
复制一个文件到当前文件夹中 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWr ...
- java缓冲流 复制文件_java使用缓冲流复制文件的方法
本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...
- inputstream java_Java实现inputstream流的复制
获取到一个inputstream后,可能要多次利用它进行read的操作.由于流读过一次就不能再读了,而InputStream对象本身不能复制,而且它也没有实现Cloneable接口,所以得想点办法. ...
- Java IO流之【缓冲流和文件流复制文件对比】
与文件流相比,缓冲流复制文件更快 代码: package Homework;import java.io.BufferedOutputStream; import java.io.File; impo ...
- 符缓冲流复制Java文件
案例需求 把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java 实现步骤 根据数据源创建字符缓冲输入流对象 根据目的地创建字符缓冲输出流对象 读写数 ...
- 字符流复制Java文件改进版
案例需求 使用便捷流对象,把模块目录下的"ConversionStreamDemo.java" 复制到模块目录下的"Copy.java" 实现步骤 根据数据源创 ...
- java中io流,Reader和Writer,InputStream和OutputStream,转换流 InputStreamReader 和 OutputStreamWriter
java中所谓流通俗来讲就是数据源的传输,我们的文件,视屏,对象都可以叫做数据源,io将他们那转换为可以在不同程序中传输的数据,众所周知电脑存储是二进制,而处理时常遇到字节和字符的写入和写出,分别以8 ...
- java io流复制文件简单实例
java io流复制文件简单实例 实例1: package com.io;import java.io.BufferedInputStream; import java.io.BufferedOutp ...
最新文章
- java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...
- python定时器每月执行一次_python 定时器,实现每天凌晨3点执行的方法
- C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常
- Yii的路由机制分析
- 分享一个有趣的网站“让我帮你百度一下“
- mpvue中使用小程序云开发总结
- Flutter之Widget 更新机制updateChild原理浅析
- git version可以卸载吗_「玩转Git命令」作为代码奴,该安装Git啦
- jQuery操作input值总结
- html5在线拍照,h5调用html5拍照上传功能
- Verilog学习——T触发器
- 最快的 Hexo 博客搭建方法
- A Cleaned, Hypernymed, Image Alt-text Dataset For Automatic Image CaptioningTransformer
- 增删改查以及冒泡算法的综合案例
- 使用Jhon工具破解Windows密码
- 用神经网络实现语音分类
- 【转】OrCAD 16.3安装和破解方法
- EasyExcel 实现模板导出、模板导入分析功能
- AutoCAD 2007官方.NET教程(一)(C#版)
- 转转集团品牌战略升级:更换新LOGO,1亿美元战投红布林