项目场景:
项目要求从第三方文件服务器上面下载文件,针对文件流进行处理时,关于重复读取遇到问题
问题描述
inputstream的内容读取后,不能再读取了
//下载文件流
InputStream fileInfoInputStream = sftp.downloadStream(location, fileNameBIN);
InputStream signInputStream = sftp.downloadStream(location, fileNameSIGN);
InputStream checkInputStream = sftp.downloadStream(location, fileNameCHECK);
//转为字符串,用于解析
String reconciliationFileInfo = IOUtils.toString(fileInfoInputStream,"GB18030");
String sign = IOUtils.toString(signInputStream);
String check = IOUtils.toString(checkInputStream,"UTF-8");
System.out.println(reconciliationFileInfo);
System.out.println(sign);
System.out.println(check);
原因分析:
因为inputStream的内部有个pos指针,当读取的时候指针会不断的移动,当移动到末尾的时候,就无法再次读取了
解决方案:
1、重置inputstream里面的指针位置【注意,使用reset的前提是inputstream已经mark了指针位置】
2、将inputstream复制使用
//重置指针,以便重复读取 InputStream.reset(); //复制使用 public static List<InputStream> cloneInput(InputStream inputStream) throws IOException { List<InputStream> inputStreamList = new ArrayList<>(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) > -1 ) { baos.write(buffer, 0, len); } baos.flush(); inputStreamList.add(new ByteArrayInputStream(baos.toByteArray())); inputStreamList.add(new ByteArrayInputStream(baos.toByteArray())); return inputStreamList; }