ZipOutputStream создает поврежденный (разархивированный) zip-файл
Я пытаюсь отправить заархивированные байты на другой сервер, а затем заставить этот сервер получить их и записать заархивированное поле. Когда я делаю архивирование и запись на одном сервере, он прекрасно работает. Локальная версия выглядит примерно так:
ZipOutputStream zout = new ZipOutputStream(FileOutputStream);
zout.write(byteBuffer, 0, len);
zout.flush()
FileOutputStream.flush();
zout.close();
Кросс-серверная реализация создает плохой вывод, хотя. Код отправки: (Волшебная строка сообщает серверу, что он получил все данные.
ZipOutputStream zout = new ZipOutputStream(out);
ZipEntry entry = new ZipEntry(fileName);
zout.putNextEntry(entry);
System.out.println("sending zipped bytes...");
zout.write(inputBuffer, contentBegin, len);
zout.flush();
zout.closeEntry();
out.flush();
byte[] magicStringData = "--------MagicStringCSE283Miami".getBytes("US-ASCII");
out.write(magicStringData, 0, magicStringData.length);
out.flush();
System.out.println("Done writing file and sending zipped bytes.");
Thread.sleep(10000);
zout.close();
clntSock.close(); // Close the socket. We are done with this client!
Получающий код выглядит так:
System.out.println("receiving zipped bytes...");
byte[] inputBuffer = new byte[BUF_SIZE];
int total2 = 0, count = 0;
while(count != -1) { // read from origin's buffer into byteBuffer until origin is out of data
count = inFromCompression.read(inputBuffer, total2, BUF_SIZE - total - 1);
String msg = new String(inputBuffer, total2, count, "US-ASCII");
total2 += count;
if(msg.contains("-------MagicString")){
System.out.println("full message received...");
break;
}
}
String inputString = new String(inputBuffer, 0, total2, "US-ASCII");
int contentEnd = inputString.indexOf("--------MagicString");
FileOutputStream fout2 = new FileOutputStream(outputFileName + ".zip");
fout2.write(inputBuffer, 0, contentEnd);
fout2.flush();
fout2.close();
System.out.println("Done writing zipped bytes.");
//Thread.sleep(10000);
//socketToCompression.close();
Есть идеи? Я думаю, это может быть что-то вроде того, что я не закрываю ZipOutputStream перед отправкой магической строки, которая сигнализирует о конце данных, но каждый раз, когда я вызываю zout.close() сразу после очистки zout, он закрывает весь сокет.
1 ответ
Избавьтесь от волшебной струны и просто отправляйте и получайте реальные данные. В настоящее время вы отбрасываете любой буфер, содержащий магическую строку, включая любые данные ZIP, которые могли быть до него.
Вам не нужен ByteArrayOutputStream.