У меня есть приложение Java для создания листов Excel. Я делаю это на основе примера BigGridDemo Apache POI для создания Excel (xlsx).
Идея состоит в том, чтобы
- создание шаблонной рабочей книги, создание листов и глобальных объектов, таких как стили ячеек, числовые форматы и т. Д.
- создать приложение для потоковой передачи данных в текстовом файле
- Заменить лист в шаблоне сгенерированными данными
В Linux на третьем шаге JVM падает с этой информацией
# A fatal error has been detected by the Java Runtime Environment:
# SIGSEGV (0xb) at pc=0x000000307a772c44, pid=11781, tid=1088649568
#
# JRE version: 6.0_24-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.1-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libc.so.6+0x72c44] memcpy+0x34
Файл hs_err_pid имеет это -
C [libc.so.6+0x72c44] memcpy+0x34
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j java.util.zip.ZipFile.getNextEntry(JI)J+0
j java.util.zip.ZipFile.access$400(JI)J+2
j java.util.zip.ZipFile$2.nextElement()Ljava/util/zip/ZipEntry;+54
j java.util.zip.ZipFile$2.nextElement()Ljava/lang/Object;+1
Похоже, это происходит, когда книга шаблона читается в виде zip-файла. Это код, который делает это.
ZipFile zip = new ZipFile(zipfile);
ZipOutputStream zos = new ZipOutputStream(out);
Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
while (en.hasMoreElements()) {
ZipEntry ze = en.nextElement();
if(!ze.getName().equals(entry)){
zos.putNextEntry(new ZipEntry(ze.getName()));
InputStream is = zip.getInputStream(ze);
copyStream(is, zos);
is.close();
}
}
Как мне избежать этого сбоя?