Я подозреваю, что решение aperkins (так как удалено), но я знаю, почему оно сработало. Строка (которая с тех пор была исправлена в его ответе)
zipOut.setLevel(ZipOutputStream.STORED); // accidentally right
использовал статическое значение ZipOutputStream.STORED
, которое по совпадению равно 0
. Так что эта строка делает установку level , используемую стандартным методом DEFLATED, равной нулю сжатия (это, очевидно, то, что вы хотите сделать, но это сработало только по счастливой случайности). Таким образом, чтобы получить то, что вы хотите явно и безопасно, используйте это вместо:
zipOut.setMethod(ZipOutputStream.DEFLATED); // this line optional
zipOut.setLevel(0);
или
zipOut.setLevel(Deflater.NO_COMPRESSION);
Если вы используете
zipOut.setMethod(ZipOutputStream.STORED);
zipOut.setLevel(Deflater.NO_COMPRESSION);
вы, вероятно, получите Исключение, которое Кея отметила в первоначальном вопросе. Я считаю, Кристиан Шлихтерле прав; вы получаете исключения, потому что вы не устанавливаете CRC в записи. Последствия этого заключаются в том, что для использования метода STORED вы должны сначала прочитать весь файл ввода или найти какой-либо другой способ установить размер, сжатый размер (должен быть равен) и CRC, прежде чем вызывать zipOut.putNextEntry()
. В противном случае вы столкнетесь с большим количеством исключений, если переполните атрибут size, записав слишком много байтов в выходной поток. Похоже, что спецификации ZIP говорят, что если вы пишете STORED-данные, то он должен записать заголовок [который включает CRC-32 и длину] "впереди" перед самими данными, следовательно, API-интерфейс java требует, чтобы они были установлены до него. можно запустить, так как он в основном поддерживает потоковую передачу в конечный zip-файл.