При попытке заархивировать архив с помощью 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();
}
}
}
Каталог, содержащий файлы для zip, находится где-то в пользовательском пространстве, а не в том же каталоге, что и полученный файл. Я предполагаю, что это может быть проблемой, но я не могу понять, как это сделать. Также я решил, что проблема может заключаться в использовании того же потока для вывода, но опять-таки я не вижу, как это сделать. В некоторых примерах и учебниках я видел, что они используют getPath()
вместо getName()
, но изменение, которое дает мне пустой почтовый файл.