Размер файла .zip при записи
Принцип части программы такой: записывается некоторая информация в архив с именем, например, "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()
возвращает размер файла без архивации.
Так как же узнать размер архива без его закрытия?