Размер файла .zip при записи

Рейтинг: 2Ответов: 0Опубликовано: 23.09.2014

Принцип части программы такой: записывается некоторая информация в архив с именем, например, "info0001.zip", с помощью ZipOutputStream. Имя файла ZipEntry, соответственно, "info0001.xml". Если размер архива превысил 1 MB, то создается новый с именем "info0002.zip". Чтобы узнать размер файла, можно вызвать метод new File("info0001.zip").length(). Но пока не закроется ZipOutputStream, реальный размер файла метод length() не вернет. Отрывки из кода:

ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(new File("info0001.zip")));
zout.putNextEntry(new ZipEntry("info0001.xml"));

// Некоторая запись в архив 50 мб
// ...

int l = new File("info0001.zip").length(); // l = 49 байт

Если закрыть архив перед вызовом length, то размер будет верный.

Но мне нужно дальше писать в этот архив.

Долго рылся в реализации класса ZipOutputStream, и нашел:
класс ZipOutputStream наследуется от DeflaterOutputStream, который содержит:

protected Deflater def;

В этом объекте в методе deflate и происходит архивация. Там происходит подсчет записанных байтов, и его можно возвратить с помощью метода getBytesRead(). Был создан класс:

public class MyZipOutputStream extends ZipOutputStream {

    public MyZipOutputStream(OutputStream out) {
        super(out);
    }

    public long size() {
        return super.def.getBytesRead();
    }
}

Но ждал жестокий облом, size() возвращает размер файла без архивации.
Так как же узнать размер архива без его закрытия?

Ответы

Ответов пока нет.