Есть лучший вариант. Создайте манекен LengthOutputStream
, который просто учитывает записанные байты:
public class LengthOutputStream extends OutputStream {
private long length = 0L;
@Override
public void write(int b) throws IOException {
length++;
}
public long getLength() {
return length;
}
}
Вы можете просто подключить LengthOutputStream
к ZipOutputStream
:
public static long sizeOfZippedDirectory(File dir) throws FileNotFoundException, IOException {
try (LengthOutputStream sos = new LengthOutputStream();
ZipOutputStream zos = new ZipOutputStream(sos);) {
... // Add ZIP entries to the stream
return sos.getLength();
}
}
Кнопка LengthOutputStream
подсчитывает байты заархивированного потока, но ничего не сохраняет, поэтому ограничение размера файла отсутствует. Этот метод дает точную оценку размера, но почти так же медленно, как создание ZIP-файла.