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.

Другие вопросы по тегам