Мне нужно заархивировать данные, поступающие из одного потока, и поместить заархивированные данные в другой.Вот код, который работает с файлами (MyOutputStream
- это простая оболочка FileOutputStream, используемая в целях отладки).Этот код работает нормально.
ZipOutputStream jos = new ZipOutputStream( new MyOutputStream(new FileOutputStream(zipFileName)));
jos.setLevel(Deflater.DEFAULT_COMPRESSION);
jos.putNextEntry(new ZipEntry("test.txt"));
FileInputStream in = new FileInputStream("test.txt");
int len;
while ((len = in.read(buffer)) > 0){
jos.write(buffer, 0, len);
}
jos.closeEntry();
jos.close();
В моем реальном приложении мне приходится иметь дело с более сложными потоками.Фактически, потоки используются для взаимодействия CORBA.Тем не менее, данные успешно прочитаны.Но когда я пытаюсь сделать jos.write(buffer, 0, len);
, никакие данные не записываются в выходной поток, лежащий в основе ZipOutputStream.Однако заголовки zip-файлов, комментарии к записям и центральный каталог написаны успешно, поэтому я получаю абсолютно правильный zip-файл с единственным исключением, что файлы пусты.
Может быть, кто-нибудь видел такое раньше?Любая помощь приветствуется.
РЕДАКТИРОВАТЬ Вот мой реальный код, который может быть полезен:
String fileName = fullSourcePath.substring(fullSourcePath.lastIndexOf('\\') + 1, fullSourcePath.length());
WrapperOutputStream out = new WrapperOutputStream(newexchangeStream64);
ZipOutputStream jos = new ZipOutputStream(out);
jos.setLevel(Deflater.NO_COMPRESSION);
jos.putNextEntry(new ZipEntry(fileName));
jos.setComment("Comment");
IDLDataHolder data = new IDLDataHolder();
LongHolder dataAmount = new LongHolder();
LongHolder written = new LongHolder();
while (true) {
exchangeStream64.Read(data, READ_AMOUNT, dataAmount);
if (0 == dataAmount.value) {
break;
}
jos.write(data.value, (int)dataAmount.value, (int)written.value);
}
jos.closeEntry();
jos.close();