how to zip a folder itself using java how to zip a folder itself using java java java

how to zip a folder itself using java


Have you tried Zeroturnaround Zip library? It's really neat! Zip a folder is just a one liner:

ZipUtil.pack(new File("D:\\reports\\january\\"), new File("D:\\reports\\january.zip"));

(thanks to Oleg Ĺ elajev for the example)


Here is the Java 8+ example:

public static void pack(String sourceDirPath, String zipFilePath) throws IOException {    Path p = Files.createFile(Paths.get(zipFilePath));    try (ZipOutputStream zs = new ZipOutputStream(Files.newOutputStream(p))) {        Path pp = Paths.get(sourceDirPath);        Files.walk(pp)          .filter(path -> !Files.isDirectory(path))          .forEach(path -> {              ZipEntry zipEntry = new ZipEntry(pp.relativize(path).toString());              try {                  zs.putNextEntry(zipEntry);                  Files.copy(path, zs);                  zs.closeEntry();            } catch (IOException e) {                System.err.println(e);            }          });    }}


It can be easily solved by package java.util.Zip no need any extra Jar files

Just copy the following code and run it with your IDE

//Import all needed packagespackage general;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class ZipUtils {    private List <String> fileList;    private static final String OUTPUT_ZIP_FILE = "Folder.zip";    private static final String SOURCE_FOLDER = "D:\\Reports"; // SourceFolder path    public ZipUtils() {        fileList = new ArrayList < String > ();    }    public static void main(String[] args) {        ZipUtils appZip = new ZipUtils();        appZip.generateFileList(new File(SOURCE_FOLDER));        appZip.zipIt(OUTPUT_ZIP_FILE);    }    public void zipIt(String zipFile) {        byte[] buffer = new byte[1024];        String source = new File(SOURCE_FOLDER).getName();        FileOutputStream fos = null;        ZipOutputStream zos = null;        try {            fos = new FileOutputStream(zipFile);            zos = new ZipOutputStream(fos);            System.out.println("Output to Zip : " + zipFile);            FileInputStream in = null;            for (String file: this.fileList) {                System.out.println("File Added : " + file);                ZipEntry ze = new ZipEntry(source + File.separator + file);                zos.putNextEntry(ze);                try {                    in = new FileInputStream(SOURCE_FOLDER + File.separator + file);                    int len;                    while ((len = in .read(buffer)) > 0) {                        zos.write(buffer, 0, len);                    }                } finally {                    in.close();                }            }            zos.closeEntry();            System.out.println("Folder successfully compressed");        } catch (IOException ex) {            ex.printStackTrace();        } finally {            try {                zos.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    public void generateFileList(File node) {        // add file only        if (node.isFile()) {            fileList.add(generateZipEntry(node.toString()));        }        if (node.isDirectory()) {            String[] subNote = node.list();            for (String filename: subNote) {                generateFileList(new File(node, filename));            }        }    }    private String generateZipEntry(String file) {        return file.substring(SOURCE_FOLDER.length() + 1, file.length());    }}

Refer mkyong..I changed the code for the requirement of current question