Сервер сжатия файлов может сжать только один файл без перезапуска
Я отлаживал это в течение нескольких дней, и я не могу найти, что не так. Этот код предназначен для сервера, который получает пакеты 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)
). Внутри этого цикла вы закрываете эти потоки, но никогда не создаете их снова.
Я предполагаю, что простое перемещение строк, которые создают потоки внутри цикла, решит вашу проблему. Но позаботьтесь об именах файлов.