Пытаясь заархивировать архив с помощью java.util.zip
, я столкнулся с множеством проблем, большинство из которых я решил. Теперь, когда я наконец получил какой-то результат, мне трудно получить «правильный» результат. У меня есть извлеченный файл ODT (каталог будет более подходящим для описания), в который я внес некоторые изменения. Теперь я хочу сжать этот каталог, чтобы воссоздать файловую структуру ODT. Заархивирование каталога и переименование его в конец с расширением .odt работает нормально, так что проблем быть не должно.
Основная проблема в том, что я теряю внутреннюю структуру каталога. Все становится «плоским», и я, кажется, не нахожу способа сохранить первоначальную многослойную структуру. Я был бы признателен за помощь в этом, так как я не могу найти проблему.
Вот соответствующие фрагменты кода:
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
FILEPATH.substring(0, FILEPATH.lastIndexOf(SEPARATOR) + 1).concat("test.zip")));
compressDirectory(TEMPARCH, out);
SEPARATOR
- это системный разделитель файлов, а FILEPATH
- это путь к файлу исходного ODT, который я переопределю, но не сделал здесь для целей тестирования. Я просто записываю в файл test.zip в том же каталоге.
private void compressDirectory(String directory, ZipOutputStream out) throws IOException
{
File fileToCompress = new File(directory);
// list contents.
String[] contents = fileToCompress.list();
// iterate through directory and compress files.
for(int i = 0; i < contents.length; i++)
{
File f = new File(directory, contents[i]);
// testing type. directories and files have to be treated separately.
if(f.isDirectory())
{
// add empty directory
out.putNextEntry(new ZipEntry(f.getName() + SEPARATOR));
// initiate recursive call
compressDirectory(f.getPath(), out);
// continue the iteration
continue;
}else{
// prepare stream to read file.
FileInputStream in = new FileInputStream(f);
// create ZipEntry and add to outputting stream.
out.putNextEntry(new ZipEntry(f.getName()));
// write the data.
int len;
while((len = in.read(data)) > 0)
{
out.write(data, 0, len);
}
out.flush();
out.closeEntry();
in.close();
}
}
}
Каталог, содержащий файлы для архивирования, находится где-то в пользовательском пространстве, а не в том же каталоге, что и результирующий файл. Я предполагаю, что это может быть проблемой, но я не могу понять, как это сделать. Также я подумал, что проблема может заключаться в использовании того же потока для вывода, но опять же, я не понимаю, как это сделать. В некоторых примерах и учебных пособиях я видел, что они используют getPath()
вместо getName()
, но при изменении этого я получаю пустой zip-файл.