Сервер сжатия файлов может сжать только один файл без перезапуска

Я отлаживал это в течение нескольких дней, и я не могу найти, что не так. Этот код предназначен для сервера, который получает пакеты UDP, а затем сжимает байты, чтобы создать ZIP-файл и разархивированный файл. Проблема в том, что он, похоже, работает для первого отправленного файла, но его необходимо перезапустить для любого другого файла. Я предполагаю, что закрываю что-то неправильно, но я не могу найти это.

for (;;) {  // Run forever, receiving and echoing datagrams
        socket.receive(packet);
        byte[] data = packet.getData();
        String fileName = new String(data, 0, packet.getLength(),"US-ASCII");

        FileOutputStream fout = new FileOutputStream(fileName.trim()); //unzipped file output
        FileOutputStream fout2 = new FileOutputStream(fileName.trim() + ".zip"); //zipped file output
        ZipOutputStream zout = new ZipOutputStream(fout2); //I guess this writes zip bytes to fout2?

        ZipEntry entry = new ZipEntry(fileName.trim()); //call the entry in the zip file "proj3.bin"
        zout.putNextEntry(entry); //the next entry our ZipOutputStream is going to write is "proj3.bin"

        while(true) {
            socket.receive(packet);
            data = packet.getData();
            String magicString = new String(data, 0, packet.getLength(), "US-ASCII");
            int index = magicString.indexOf("--------MagicStringCSE283Miami");
            if(index != -1){
                fout.write(data, 0, index);
                fout.flush();
                fout.close();

                zout.write(data, 0, index); //write the byteBuffer's data to the client via the zip output stream
                zout.flush(); //push all data out of the zipOutputStream before continuing
                fout2.flush();
                zout.close();
                fout2.close();
                break;
            }
            //System.out.println("packet received");
            fout.write(packet.getData(), 0, packet.getLength());
            fout.flush();

            zout.write(data, 0, packet.getLength()); //write the byteBuffer's data to the client via the zip output stream
            zout.flush(); //push all data out of the zipOutputStream before continuing
            fout2.flush();
        }   
    }

1 ответ

Вы создаете выходные потоки перед входом в бесконечный цикл (while(true)). Внутри этого цикла вы закрываете эти потоки, но никогда не создаете их снова.

Я предполагаю, что простое перемещение строк, которые создают потоки внутри цикла, решит вашу проблему. Но позаботьтесь об именах файлов.

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