当在使用 ZIPInputStream
循环处理压缩文件中的条目时,出现 HSSFWorkbook stream closed
错误,通常是因为 HSSFWorkbook
在处理过程中关闭了底层的输入流,从而影响了后续 ZIPInputStream
读取其他条目。
为了避免 HSSFWorkbook
关闭底层输入流影响 ZIPInputStream
的使用,可以将每个 ZIP 条目的内容复制到一个 ByteArrayInputStream
中,然后使用这个新的输入流来创建 HSSFWorkbook
。这样,即使 HSSFWorkbook
关闭了 ByteArrayInputStream
,也不会影响 ZIPInputStream
。
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipProcessingExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("your_zip_file.zip");
ZipInputStream zipInput = new ZipInputStream(fis)) {
ZipEntry entry;
while ((entry = zipInput.getNextEntry()) != null) {
if (!entry.isDirectory()) {
// 将 ZIP 条目的内容复制到 ByteArrayOutputStream 中
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = zipInput.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
// 将 ByteArrayOutputStream 转换为 ByteArrayInputStream
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
try {
// 使用 ByteArrayInputStream 创建 HSSFWorkbook
Workbook workbook = new HSSFWorkbook(bais);
// 处理工作簿
System.out.println("Processing file: " + entry.getName());
// 这里可以添加具体的处理逻辑
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭 ByteArrayInputStream
bais.close();
}
}
// 关闭当前 ZIP 条目
zipInput.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}