Java ZipinputStream закрывается после прочтения наживления изображений
Вопрос
Мы пытаемся изменить один из файлов XML в 2007 году MS Excel. Для этого файл XLSX расстегнут с использованием ZipinputStream Java, а затем скопировал в новый zip-файл с использованием zipoutputtream. Фрагменты кода, как показано ниже:
FileInputStream fis = new FileInputStream("C:\\_132139TRD-GDR_Conversion.xlsx");
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
FileOutputStream fos = new FileOutputStream("C:\\_132139TRD-GDR_Conversion123.xlsx");
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Processing Entry : " + entry.getName());
System.out.println("Processing Entry Size : " + entry.getSize());
System.out.println("Entry Available : " + zis.available());
if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){
//Process XML
}
ZipEntry ze = new ZipEntry(entry.getName());
zos.putNextEntry(ze);
if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){
zos.write(XML.getBytes());
}else{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
while ((count = zis.read(data, 0, BUFFER)) != -1) {
stream.write(data, 0, count);
}
tempBuffer = stream.toByteArray();
zos.write(tempBuffer);
}
zos.closeEntry();
}
zos.close();
fos.close();
zis.close();
fis.close();
В этом фрагменте после того, как мы столкнулись с файлом JPEG, «запись = zis.getnextentry ()» возвращает NULL. Мы не можем прочитать следующую поддержку zipentry - что приводит к неполной Excel. Выход для образца файла Excel как ниже:
Start Date Mon Dec 06 15:33:33 IST 2010
Processing Entry : xl/media/Logo2005_JPM_A_Black_170x50.jpeg
Processing Entry Size : -1
Entry Available : 1
End Date Mon Dec 06 15:34:58 IST 2010
ZipinPutStream закрывается, как только файл JPEG копируется. (WhoineOF и REACHEOF PRITALBLES Оба поворота, так и вход - это NULL после копирования изображения).
Кто-нибудь столкнулся с подобной проблемой? Это ошибка, которую REACHEOF также превращается в True после копирования файла?
Мидхун.
Решение
Это потому, что вы читаете данные для изображения из zis
вместо от zis.getInputStream(entry)
.
После копирования петли все данные из zis
будет читаться, поэтому вы получите EOF.