Java.util.zip заменяет один zip-файл

Проблема

У меня есть существующий zip-файл «main.zip». Я хочу заменить в нем один файл, «скажем, main.zip/foo».

Я знаю:

http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipOutputStream.html

Однако это не делает то, что я хочу, поскольку создает новый Zip-файл, и поэтому мне также придется добавить все существующие записи в main.zip.

Вопрос:

Есть ли способ «заменить» один файл в Zip-архиве на Java? (Без пересоздания нового zip-архива и копирования всех старых данных).


person Community    schedule 09.12.2012    source источник
comment
возможный дубликат Java, добавляющий файлы в zip   -  person Frank van Puffelen    schedule 09.12.2012
comment
Из одного из этих вопросов следует следующее краткое резюме: К сожалению, Java не может обновлять Zip-файлы ... Вам нужно будет распаковать его во временную папку, добавить туда файлы и снова запаковать.   -  person Frank van Puffelen    schedule 09.12.2012
comment
@FrankvanPuffelen: мой вопрос - дупликация. Я думаю, что мы должны закрыть (но не удалить) вопрос.   -  person    schedule 09.12.2012


Ответы (1)


Я думаю, вам повезло.

Используя java 7 java.nio.file.FileSystem вместе с Files.copy(), мне удалось вставить текстовый файл в большой zip-файл за доли секунды.

public static void main(String[] argv) {
    Path myFilePath = Paths.get("c:/dump2/mytextfile.txt");

    Path zipFilePath = Paths.get("c:/dump2/myarchive.zip");
    try( FileSystem fs = FileSystems.newFileSystem(zipFilePath, null) ){
        Path fileInsideZipPath = fs.getPath("/mytextfile.txt");
        Files.copy(myFilePath, fileInsideZipPath);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Он «монтирует» zip с помощью провайдера ZipFileSystem. Затем вы можете просто скопировать в него все, что хотите. Изменения происходят fs.close()

Подробнее @ oracle

person Aksel Willgert    schedule 09.12.2012
comment
Мне нравится. (Узнать о java.nio.file.FileSystem особенно круто). Спасибо1 - person ; 09.12.2012
comment
эй, @AkselWillgert, не могли бы вы помочь мне с этим? - person Ordiel; 01.02.2013
comment
К сожалению, ZipFileSystem исчерпает память при попытке использовать Files.copy для добавления большого файла таким образом. - person Coke; 28.03.2013
comment
Думаю, я пробовал это для относительно больших файлов, но могу вспомнить неправильно. О каких размерах и компьютерной системе вы говорите? - person Aksel Willgert; 28.03.2013
comment
Спасибо, это то, что я искал. Используя этот метод, я могу добавить txt-файл в основную папку zip, но не могу углубиться. Я хочу добавить текстовый файл в папку, которая находится внутри zip-файла. Когда я меняю код на Path fileInsideZipPath = fs.getPath(res/raw/mytextfile.txt); Я получаю java.nio.file.NoSuchFileException: res/raw. Знаете ли вы метод, чтобы управлять этим? - person irmu; 12.06.2013
comment
существует ли папка, иначе вам нужно ее создать. Я думаю, что имена внутри почтового индекса также чувствительны к регистру. - person Aksel Willgert; 12.06.2013
comment
Да, папка существует и все имена в нижнем регистре. - person irmu; 13.06.2013
comment
Большое спасибо, Аксель Вильгерт. - person Arthur; 08.06.2014