【问题标题】:Create zip from list of directories. Java从目录列表创建 zip。爪哇
【发布时间】:2014-12-10 13:27:23
【问题描述】:

我有一些类,将目录打包为 zip 文件,但我想将其修改为打包目录列表。我正在尝试,但没有成功。我不知道为什么。 所以,我给了 List 并希望每个目录(包括子目录和文件)都归档。

这是我的主要课程:

class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        ZipNew zn = new ZipNew();

        List<String> foldersList = new ArrayList<String>();
        foldersList.add("c:\\test\\t1");
        foldersList.add("c:\\test\\t2");
        foldersList.add("c:\\test\\t3");

        String zipNewPath = "c:\\test\\testAll.zip";

        zn.pack(foldersList, zipNewPath);
    }
}

这是 zip 处理器:

public class ZipNew {
    private List<String> fileList = new ArrayList<String>();
    private String outputZip;
    private List<String> sourceFolders = new ArrayList<String>();
    private String currFolder;

    public boolean pack(List<String> sourceFolders, String outputZip) {
        this.outputZip = outputZip;
        this.sourceFolders = sourceFolders;
        for (String sourceFolder : sourceFolders) {
            this.currFolder = sourceFolder;
            generateFileList( new File(sourceFolder) );
        }
        boolean packed = packInZip(outputZip);
        return packed;
    }

    private void generateFileList(File node){
        if(node.isFile()){
            fileList.add(generateZipEntry(node.getAbsoluteFile().toString()));
        }
        else if(node.isDirectory()){
            String[] subNote = node.list();
            for(String filename : subNote){
                generateFileList(new File(node, filename));
            }
        }
    }

    private String generateZipEntry(String file){
        return file.substring(currFolder.length() + 1, file.length());
    }

    private boolean packInZip(String zipFile){
        byte[] buffer = new byte[1024];
        try{
            FileOutputStream fos = new FileOutputStream(zipFile);
            ZipOutputStream zos = new ZipOutputStream(fos);

            for (String sourceFolder : sourceFolders) {
                this.currFolder = sourceFolder;
                for (String file : this.fileList) {
                    ZipEntry ze = new ZipEntry(file);
                    zos.putNextEntry(ze);
                    FileInputStream in = new FileInputStream(sourceFolder + File.separator + file);
                    int len;
                    while ((len = in.read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                    in.close();
                }
            }

            zos.closeEntry();
            zos.close();
            return true;
        } catch(IOException ex){
            ex.printStackTrace();
            return false;
        }
    }
}

最后,我希望存档包含文件夹“c:\test\t1”、“c:\test\t2”、“c:\test\t3” 谢谢。

【问题讨论】:

    标签: java zip archive


    【解决方案1】:

    答案:)

    public class ZipNew {
        private List<String> fileList = new ArrayList<String>();
        private String outputZip;
        private List<String> sourceFolders = new ArrayList<String>();
        private String currFolder;
    
        public boolean pack(List<String> sourceFolders, String outputZip) {
            this.outputZip = outputZip;
            this.sourceFolders = sourceFolders;
            for (String sourceFolder : sourceFolders) {
                this.currFolder = sourceFolder;
                generateFileList( new File(currFolder) );
            }
            boolean packed = packInZip(outputZip);
            return packed;
        }
    
        private void generateFileList(File node){
            if(node.isFile()){
                fileList.add(generateZipEntry(node.getAbsoluteFile().toString()));
            }
            else if(node.isDirectory()){
                String[] subNote = node.list();
                for(String filename : subNote){
                    generateFileList(new File(node, filename));
                }
            }
        }
    
        private String generateZipEntry(String file){
            return file.substring(currFolder.lastIndexOf("\\") + 1, file.length());
        }
    
        private boolean packInZip(String zipFile){
            byte[] buffer = new byte[1024];
            try{
                FileOutputStream fos = new FileOutputStream(zipFile);
                ZipOutputStream zos = new ZipOutputStream(fos);
    
    
                    for (String file : this.fileList) {
                        ZipEntry ze = new ZipEntry(file);
                        zos.putNextEntry(ze);
                        FileInputStream in = new FileInputStream(currFolder.substring(0, currFolder.lastIndexOf("\\")) + File.separator + file);
                        int len;
                        while ((len = in.read(buffer)) > 0) {
                            zos.write(buffer, 0, len);
                        }
                        in.close();
                    }
    
    
                zos.closeEntry();
                zos.close();
                return true;
            } catch(IOException ex){
                ex.printStackTrace();
                return false;
            }
        }
    }
    

    【讨论】: