【问题记录】关于inputstream不能重复读取的解决方法
项目场景:
项目要求从第三方文件服务器上面下载文件,针对文件流进行处理时,关于重复读取遇到问题
问题描述
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;}
【问题记录】关于inputstream不能重复读取的解决方法
项目场景:
项目要求从第三方文件服务器上面下载文件,针对文件流进行处理时,关于重复读取遇到问题
问题描述
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;}
发布评论