Suppose I have the following directory structure.
D:reportsjanuary
Inside january there are suppose two excel files say A.xls and B.xls. There are many places where it has been written about how to zip files using java.util.zip
. But I want to zip the january folder itself inside reports folder so that both january and january.zip will be present inside reports. (That means when I unzip the january.zip file I should get the january folder).
Can anyone please provide me the code to do this using java.util.zip
. Please let me know whether this can be more easily done by using other libraries.
Thanks a lot…
Advertisement
Answer
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 packages package 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