我將 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);
}
uj5u.com熱心網友回復:
從 Zipfile 讀取時,您有一個用于存檔的 InputStream。然后你遍歷那里的不同條目,對于每個條目,你再次有一個 InputStream 可供讀取。確保不要關閉條目的 InputStreams,因為該事件將關閉存檔流。
在您的情況下,可能是 XSSFWorkbook 的建構式或 readWorkbook 方法正在關閉流。
uj5u.com熱心網友回復:
唯一的選擇是包裝它,這樣你就可以攔截close()并防止它關閉拉鏈。就像是:
var wrapper = new FilterInputStream(zis) {
@Override public void close() {}
}
然后通過wrapper不zis給new XSSFWorkbook。
注意:警告-您的代碼受到嚴重阻礙,本質上是錯誤的。您需要確保在最后關閉該 ZipInputStream,而您現在不這樣做。你的例外處理真的很糟糕。您必須以硬退出結束所有例外塊,僅記錄它是不夠的。throw new RuntimeException("uncaught", e);是后備選項(許多 IDEe.printStackTrace()默認附帶。這是一個已知的非常愚蠢的默認設定,請更新您的 IDE 以解決此問題。同時使用 try-with-resources 以確保始終發生關閉(僅呼叫close()還不夠好;那close()如果發生例外,將不會呼叫您在代碼段中的呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/421131.html
標籤:
上一篇:如何在trie中考慮空格字符?
