2016-06-11 6 views
1

У меня есть zip-файл, и я хочу заменить один файл внутри него другим файлом. Поэтому не нужно удалять запись в zip, просто замените файл на zip-запись другим.Замена zip-файла без распаковки в Java

Вот что я пробовал.

public void replaceConfigurationFile(ZipFile zipFile, ZipOutputStream zos, String pathToNewFile, String configFileToReplaced) 
     throws IOException { 
    String zipEntryName; 
    for(Enumeration<?> e = zipFile.entries(); e.hasMoreElements();) { 

     ZipEntry entryIn = (ZipEntry) e.nextElement(); 
     zipEntryName = entryIn.getName(); 
      if(zipEntryName.endsWith(configFileToReplaced)) { 

       FileInputStream fis = new FileInputStream(pathToNewFile); 
       ZipEntry zipEntry = new ZipEntry(zipEntryName); 

       zos.putNextEntry(zipEntry); 

       byte[] bytes = new byte[1024]; 
       int length; 
       while ((length = fis.read(bytes)) >= 0) { 
        zos.write(bytes, 0, length); 
       } 

       zos.closeEntry(); 
       fis.close(); 
      } else { 
       zos.putNextEntry(entryIn); 
       InputStream is = zipFile.getInputStream(entryIn); 
       byte [] buf = new byte[1024]; 
       int len; 
       while((len = (is.read(buf))) > 0) {    
        zos.write(buf, 0, len); 
       } 
      zos.closeEntry(); 
      } 


    } // enf of for 
} 

У меня есть файл зип запись с именем:

WEB-INF/classes/config/app-dev.yml 

и у меня есть файл на месте г диск на месте

D:/app-dev.yml 

Я могу скопировать файл к другой zip-файл, заменив файл, который я хочу заменить. Но это действительно не нужно (для создания другого файла). Итак, что мне нужно сделать, чтобы просто заменить файл на свой файл.

Я искал разные сообщения в Stackoverflow, но не смог найти то, что мне нужно. Я читал, что запись zip не может быть удалена, но как ее заменить? Пожалуйста, помогите

ответ

2

Ваша проблема в том, что новый файл может быть больше старого или меньше! Вам нужно сделать именно то, что вы сделали, чтобы внести изменения. Вероятность того, что новый файл, ZIPped, равна точно того же размера, что и предыдущий, практически равен нулю.

+0

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

+0

Точно: код для копирования остальных данных в файле «вверх», чтобы освободить место для ваших больших данных сложнее, чем просто: 1) Сделайте то, что вы показали выше; 2) Удалить старый файл; 3) Переименуйте новый файл. –

+0

У меня есть 5 файлов конфигурации, а размер zip-файла - 170 МБ, поэтому это будет означать, создавая zip-файл пять раз, 5 X 170 МБ файлов, поэтому создание, замена и переименование 5 раз такой большой файл очень неэффективен –

2

Стандартные библиотеки ZIP ZIP-файлов не позволяют вам обновлять существующий ZIP-файл. Вам необходимо использовать стороннюю библиотеку. Поиск Google должен найти несколько альтернатив.

Но вы должны знать несколько вещей:

  • Если ваше приложение ... или система ... сбой при обновлении файла ZIP, файл может быть поврежден.

  • Когда файл ZIP обновляется, заменяемая версия файла будет добавлена ​​в ZIP-файл. Старая версия будет по-прежнему находиться в ZIP ... но не в индексе ZIP-файла. Следовательно, обновление ZIP-файла (без его перезаписи) уничтожает дисковое пространство.

+0

уверен, вы знаете какие-нибудь такие библиотеки? можете у предложить? –

+0

Я не могу рекомендовать какие-либо библиотеки. Но вы можете найти их с помощью Google. –

+0

Я нашел один https: // github.com/zeroturnaround/zt-zip Не решает мою проблему точно, но да, я могу заставить ее работать Спасибо за предложение –

Смежные вопросы