Я нахожусь в aperkins Решение (после удаления), но я знаю, почему это сработало. Линия (которая впоследствии была исправлена в своем ответе)
zipOut.setLevel(ZipOutputStream.STORED); // accidentally right
использовал статическое значение ZipOutputStream.STORED
, который по совпадению приравнивает 0
. Итак, что делает эта строка, установите уровень , используемый методом 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);
вы, вероятно, получите исключение, что Keya отмечено в оригинальный вопрос. Я считаю, Christian Schlichtherle прав; вы получаете Исключения, потому что вы не устанавливаете CRC в записи. Это связано с тем, что для использования метода STORED вам необходимо сначала прочитать весь файл записи или найти другой способ установить размер, сжатый размер (должен быть равен) и CRC, прежде чем вы вызовете zipOut.putNextEntry()
. В противном случае вы столкнетесь с дополнительными исключениями, если вы превысите атрибут размера, записав слишком много байтов в выходной поток. Похоже, что в спецификациях ZIP говорят, что если вы записываете STORED-данные, тогда перед самими данными он должен записать заголовок [который включает в себя CRC-32 и длину] перед фронтом, поэтому API-интерфейс Java, требующий их, должен быть установлен перед ним может начаться, поскольку он в основном поддерживает только потоковое воспроизведение до последнего zip-файла.
Эти постоянные являются «кодовым акцентом» из другого возраста (возможно, C) ... Я хочу, чтобы Дэвид Коннелли прочитал о переписках Java, прежде чем он написал ZipOutputStream. –
@ ChristopheRoussy Это было бы довольно сложно, так как 'ZipOutputStream' появился за много лет до перечислений. – EJP