Перезапись ZipEntrys - PullRequest
       16

Перезапись ZipEntrys

1 голос
/ 24 февраля 2011

Простой вопрос,

Я записываю серию текстовых файлов в zip, просто оборачивая fileoutputstream в zipoutputstream, а затем в печатную машину.

public static int saveData(File outfile, DataStructure input) {
//variables
ArrayList<String> out = null;
FileOutputStream fileout = null;
ZipOutputStream zipout = null;
PrintWriter printer = null;

//parameter tests

try {
    fileout = new FileOutputStream(outfile);
    zipout = new ZipOutputStream(fileout);
    printer = new PrintWriter(zipout);
} catch (Exception e) {
    e.printStackTrace();
    return util.FILE_INVALID;
}

for(DataItem data : input){
    //process the data into a list of strings

    try {
    zipout.putNextEntry(new ZipEntry( dataFileName ));
    for(String s : out) {
        printer.println(s);
    }
    zipout.closeEntry();
    } catch (Exception e) {
    try {
        fileout.close();
    } catch (Exception x) {
        x.printStackTrace();
        return util.CRITICAL_ERROR;
    }
    e.printStackTrace();
    return util.CRITICAL_ERROR;
    }

}


try {
    fileout.close();
} catch (Exception e) {
    e.printStackTrace();
    return util.CRITICAL_ERROR;
}

return util.SUCCESS;

}

Ранее в приложении, которое я разрабатывал, я только что сохранял его в текущем каталоге для тестирования и знаю, что в случае уже существующего файла этот файл будет перезаписан (и использовал это). То, что я не знаю, это поведение на молнии. Будет ли он перезаписывать записи с тем же именем? Или он просто перезапишет весь zip-файл (что было бы удобно для моих целей.

K.Barad

Ответы [ 2 ]

2 голосов
/ 07 августа 2012

Как сказал Джоэл, если вы попытаетесь добавить дубликат ZipEntry, вы получите исключение. Если вы хотите заменить текущую запись, вам нужно удалить ее и вставить заново. Вы можете сделать что-то, как здесь ниже, чтобы достичь этого:

    private ZipFile addFileToExistingZip(File zipFile, File versionFile) throws IOException{
    // get a temp file
    File tempFile = File.createTempFile(zipFile.getName(), null);
    // delete it, otherwise you cannot rename your existing zip to it.
    tempFile.delete();

    boolean renameOk=zipFile.renameTo(tempFile);
    if (!renameOk)
    {
        throw new RuntimeException("could not rename the file "+zipFile.getAbsolutePath()+" to "+tempFile.getAbsolutePath());
    }
    byte[] buf = new byte[4096 * 1024];

    ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile));
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));

    ZipEntry entry = zin.getNextEntry();
    while (entry != null) {
        String name = entry.getName();
        boolean toBeDeleted = false;
            if (versionFile.getName().indexOf(name) != -1) {
                toBeDeleted = true;
            }
        if(!toBeDeleted){
            // Add ZIP entry to output stream.
            out.putNextEntry(new ZipEntry(name));
            // Transfer bytes from the ZIP file to the output file
            int len;
            while ((len = zin.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        }
        entry = zin.getNextEntry();
    }
    // Close the streams
    zin.close();
    // Compress the files
    InputStream in = new FileInputStream(versionFile);
    String fName = versionFile.getName();
    // Add ZIP entry to output stream.
    out.putNextEntry(new ZipEntry(fName));
    // Transfer bytes from the file to the ZIP file
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    // Complete the entry
    out.closeEntry();
    in.close();
    // Complete the ZIP file
    out.close();
    tempFile.delete();

    return new ZipFile(zipFile);
}

Приведенный выше код работал для меня, когда нужно было добавить новую запись zip в существующий файл zip. Если запись уже присутствует внутри почтового индекса, перезапишите ее. Комментарии / улучшения в коде приветствуются! Спасибо!

2 голосов
/ 24 февраля 2011

Если вы попытаетесь добавить дубликат ZipEntry, вы получите исключение.Если вы хотите заменить текущую запись, вам нужно удалить ее и вставить заново.Я подозреваю, что полученное вами исключение во многом совпадает с этим .

...