/** * 利用workBook创建一个输入流用于后续操作 * * @return */ private InputStream createInputSream() { if (inputStream != null) { try { inputStream.reset(); return inputStream; } catch (Exception e) { log.error("inputStream.reset failed: {}", e.getMessage()); throw new BadException(e.getMessage()); } } try { var outputStream = new ByteArrayOutputStream(); workBook.write(outputStream); outputStream.flush(); var length = outputStream.toByteArray().length; log.info("bytes.length = {}", length); inputStream = new ByteArrayInputStream(outputStream.toByteArray()); return inputStream; } catch (Exception e) { log.error("创建输入流失败: {}", e.getMessage()); throw new BadException("创建文件输入流失败: " + e.getMessage()); } }
大体思路:workBook写入outputStream, 利用outputStream.toByteArray()取得二进制数据来初始化一个InputStream对象,获得一个可用的实例化对象。
另外:如果这个InputStream需要多次被读取,需要在下次使用前调用reset()接口重置下,否则第二次读取时会报异常,提示文件内容是空的,因为第一次读时已经读到了文件尾,再往下读时已经无数据可读了。
标签:outputStream,java,inputStream,length,getMessage,POI,new,InputStream From: https://www.cnblogs.com/joeblackzqq/p/18263911