【问题记录】关于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;}