import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; // import java.util.zip.Deflater; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @param source file or folder to compress for * @param destination zip file located at * @param comment the comment of zip file, if comment == null will ignore * @param level compression level, reference to Deflater class */ public static void compress(File source, File destination, String comment, int level) throws IOException{ ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destination)); zos.setComment(comment); zos.setLevel(level); compress(zos, source.getParent(), source); zos.flush(); zos.close(); } // this method will be hidden private static void compress(ZipOutputStream zos, String rootpath, File source) throws IOException { String filename = source.toString().substring(rootpath.length() + 1); if (source.isFile()) { zos.putNextEntry(new ZipEntry(filename)); FileInputStream fis = new FileInputStream(source); byte[] buffer = new byte[1024]; for (int length; (length = fis.read(buffer)) > 0; ) { zos.write(buffer, 0, length); } fis.close(); zos.closeEntry(); } else if (source.isDirectory()) { zos.putNextEntry(new ZipEntry(filename + "/")); zos.closeEntry(); File[] files = source.listFiles(); for (File file : files) { compress(zos, rootpath, file); } } }
You could modify above Java code if you would like to enhance for compressing many files or folders.
Seems like this
public static void compress(File[] files, File destination, String comment, int level) throws IOException{ // ... }