0

我将 excel 文件的 zip 作为多部分文件上传,但是当我创建第一个文件的 Workbook 对象时,流被关闭并且我无法读取下一个文件。它适用于 zip 中的单个文件,但不适用于多个文件。有人可以帮忙吗?TIA。

       try {
            ZipInputStream zis = new ZipInputStream(multipartFile.getInputStream());
            ZipEntry zipEntry;
            while((zipEntry = zis.getNextEntry()) != null) {
                XSSFWorkbook workbook = new XSSFWorkbook(zis);
                readWorkbook(workbook);
            }
            zis.close();
        } catch (Exception e) {
            LOG.error(e);
        }
4

2 回答 2

0

从 Zipfile 读取时,您有一个用于存档的 InputStream。然后你遍历那里的不同条目,对于每个条目,你再次有一个 InputStream 可供读取。确保不要关闭条目的 InputStreams,因为该事件将关闭存档流。

在您的情况下,可能是 XSSFWorkbook 的构造函数或 readWorkbook 方法正在关闭流。

于 2022-01-25T13:41:21.973 回答
0

唯一的选择是包装它,这样你就可以拦截close()并防止它关闭拉链。就像是:

var wrapper = new FilterInputStream(zis) {
  @Override public void close() {}
}

然后通过而wrapper不是。zisnew XSSFWorkbook

注意:警告-您的代码受到严重阻碍,本质上是错误的。您需要确保在最后关闭该 ZipInputStream,而您现在不这样做。你的异常处理真的很糟糕。您必须以硬退出结束所有异常块,仅记录它是不够的。throw new RuntimeException("uncaught", e);是后备选项(许多 IDEe.printStackTrace()默认附带。这是一个已知的非常愚蠢的默认设置,请更新您的 IDE 以解决此问题。同时使用 try-with-resources 以确保始终发生关闭(仅调用close()还不够好;那close()如果发生异常,将不会调用您在代码段中的调用。

于 2022-01-25T13:53:26.903 回答