178 votes

Comment créer un fichier zip en Java

J'ai un fichier texte dynamique qui extrait le contenu d'une base de données en fonction de la requête de l'utilisateur. Je dois écrire ce contenu dans un fichier texte et le zipper dans un dossier dans une servlet. Comment dois-je m'y prendre ?

0voto

Tarpan Patel Points 9

Vous devez principalement créer deux fonctions. La première est writeToZipFile() et la seconde est createZipfileForOutPut .... et ensuite appeler la fonction createZipfileForOutPut('file name of .zip')` ...

 public static void writeToZipFile(String path, ZipOutputStream zipStream)
        throws FileNotFoundException, IOException {

    System.out.println("Writing file : '" + path + "' to zip file");

    File aFile = new File(path);
    FileInputStream fis = new FileInputStream(aFile);
    ZipEntry zipEntry = new ZipEntry(path);
    zipStream.putNextEntry(zipEntry);

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

    zipStream.closeEntry();
    fis.close();
}

public static void createZipfileForOutPut(String filename) {
    String home = System.getProperty("user.home");
   // File directory = new File(home + "/Documents/" + "AutomationReport");
    File directory = new File("AutomationReport");
    if (!directory.exists()) {
        directory.mkdir();
    }
    try {
        FileOutputStream fos = new FileOutputStream("Path to your destination" + filename + ".zip");
        ZipOutputStream zos = new ZipOutputStream(fos);

        writeToZipFile("Path to file which you want to compress / zip", zos);

        zos.close();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

0voto

sendon1982 Points 610

Il existe une autre option en utilisant zip4j à l'adresse https://github.com/srikanth-lingala/zip4j

Créer un fichier zip avec un seul fichier / Ajouter un seul fichier à un zip existant

new ZipFile("filename.zip").addFile("filename.ext"); Ou

new ZipFile("filename.zip").addFile(new File("filename.ext"));

Création d'un fichier zip avec plusieurs fichiers / Ajout de plusieurs fichiers à un zip existant

new ZipFile("filename.zip").addFiles(Arrays.asList(new File("first_file"), new File("second_file")));

Créer un fichier zip en y ajoutant un dossier / Ajouter un dossier à un zip existant

new ZipFile("filename.zip").addFolder(new File("/user/myuser/folder_to_add"));

Création d'un fichier zip à partir d'un flux / Ajout d'un flux à un zip existant new ZipFile("filename.zip").addStream(inputStream, new ZipParameters());

0voto

Tevfik Kiziloren Points 117

Je sais que cette question a déjà reçu une réponse mais si vous avez une liste de chaînes de caractères et que vous voulez créer un fichier séparé pour chaque chaîne de caractères dans l'archive, vous pouvez utiliser le snippet ci-dessous.

public void zipFileTest() throws IOException {

    Map<String, String> map = Map.ofEntries(
            new AbstractMap.SimpleEntry<String, String>("File1.txt", "File1 Content"),
            new AbstractMap.SimpleEntry<String, String>("File2.txt", "File2 Content"),
            new AbstractMap.SimpleEntry<String, String>("File3.txt", "File3 Content")
    );

    createZipFileFromStringContents(map, "archive.zip");

}

public void createZipFileFromStringContents(Map<String, String> map, String zipfilePath) throws IOException {

    FileOutputStream fout = new FileOutputStream(zipfilePath);
    ZipOutputStream zout = new ZipOutputStream(fout);

    for (Map.Entry<String, String> entry : map.entrySet()) {
        String fileName = entry.getKey();
        ZipEntry zipFile = new ZipEntry(fileName);
        zout.putNextEntry(zipFile);
        String fileContent = entry.getValue();
        zout.write(fileContent.getBytes(), 0, fileContent.getBytes().length);
        zout.closeEntry();
    }

    zout.close();
}

Il créera un fichier zip avec la structure comme dans l'image ci-dessous :

zip file structure

0voto

dkero Points 101

Voici ma solution de travail :

public static byte[] createZipFile(Map<String, FileData> files) throws IOException {
    try(ByteArrayOutputStream tZipFile = new ByteArrayOutputStream()) {
        try (ZipOutputStream tZipFileOut = new ZipOutputStream(tZipFile)) {
            for (Map.Entry<String, FileData> file : files.entrySet()) {
                ZipEntry zipEntry = new ZipEntry(file.getValue().getFileName());
                tZipFileOut.putNextEntry(zipEntry);
                tZipFileOut.write(file.getValue().getBytes());
            }
        }

        return tZipFile.toByteArray();
    }
}

public class FileData {
    private String fileName;
    private byte[] bytes;

    public String getFileName() {
        return this.fileName;
    }

    public byte[] getBytes() {
        return this.bytes;
    }
}

Cela créera un byte[] de fichier ZIP qui contient un ou plusieurs fichiers compressés. J'ai utilisé cette méthode dans la méthode du contrôleur et écrit les bytes[] du fichier ZIP dans la réponse pour télécharger le(s) fichier(s) ZIP du serveur.

-1voto

cmujica Points 424

Si vous voulez décompresser sans logiciel, utilisez ce code. Autre code avec les fichiers pdf envoie l'erreur sur la décompression manuelle

byte[] buffer = new byte[1024];     
    try
    {   
        FileOutputStream fos = new FileOutputStream("123.zip");
        ZipOutputStream zos = new ZipOutputStream(fos);
        ZipEntry ze= new ZipEntry("file.pdf");
        zos.putNextEntry(ze);
        FileInputStream in = new FileInputStream("file.pdf");
        int len;
        while ((len = in.read(buffer)) > 0) 
        {
            zos.write(buffer, 0, len);
        }
        in.close();
        zos.closeEntry();
        zos.close();
    }
    catch(IOException ex)
    {
       ex.printStackTrace();
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X