directories in a zip file when using java.util.zip.ZipOutputStream

后端 未结 6 1613
北荒
北荒 2020-12-04 13:40

Lets say I have a file t.txt, a directory t and another file t/t2.txt. If I use the linux zip utility \"zip -r t.zip t.txt t\", I get a zip file with the following entries i

6条回答
  •  日久生厌
    2020-12-04 13:50

    Java Program to Zip(folders contains either empty or full ones)

    public class ZipUsingJavaUtil {
        /*
         * Zip function zip all files and folders
         */
        @Override
        @SuppressWarnings("finally")
        public boolean zipFiles(String srcFolder, String destZipFile) {
            boolean result = false;
            try {
                System.out.println("Program Start zipping the given files");
                /*
                 * send to the zip procedure
                 */
                zipFolder(srcFolder, destZipFile);
                result = true;
                System.out.println("Given files are successfully zipped");
            } catch (Exception e) {
                System.out.println("Some Errors happned during the zip process");
            } finally {
                return result;
            }
        }
    
        /*
         * zip the folders
         */
        private void zipFolder(String srcFolder, String destZipFile) throws Exception {
            ZipOutputStream zip = null;
            FileOutputStream fileWriter = null;
            /*
             * create the output stream to zip file result
             */
            fileWriter = new FileOutputStream(destZipFile);
            zip = new ZipOutputStream(fileWriter);
            /*
             * add the folder to the zip
             */
            addFolderToZip("", srcFolder, zip);
            /*
             * close the zip objects
             */
            zip.flush();
            zip.close();
        }
    
        /*
         * recursively add files to the zip files
         */
        private void addFileToZip(String path, String srcFile, ZipOutputStream zip, boolean flag) throws Exception {
            /*
             * create the file object for inputs
             */
            File folder = new File(srcFile);
    
            /*
             * if the folder is empty add empty folder to the Zip file
             */
            if (flag == true) {
                zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/"));
            } else { /*
                     * if the current name is directory, recursively traverse it
                     * to get the files
                     */
                if (folder.isDirectory()) {
                    /*
                     * if folder is not empty
                     */
                    addFolderToZip(path, srcFile, zip);
                } else {
                    /*
                     * write the file to the output
                     */
                    byte[] buf = new byte[1024];
                    int len;
                    FileInputStream in = new FileInputStream(srcFile);
                    zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
                    while ((len = in.read(buf)) > 0) {
                        /*
                         * Write the Result
                         */
                        zip.write(buf, 0, len);
                    }
                }
            }
        }
    
        /*
         * add folder to the zip file
         */
        private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception {
            File folder = new File(srcFolder);
    
            /*
             * check the empty folder
             */
            if (folder.list().length == 0) {
                System.out.println(folder.getName());
                addFileToZip(path, srcFolder, zip, true);
            } else {
                /*
                 * list the files in the folder
                 */
                for (String fileName : folder.list()) {
                    if (path.equals("")) {
                        addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip, false);
                    } else {
                        addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip, false);
                    }
                }
            }
        }
    }
    

提交回复
热议问题