使用java

时间:2018-01-11 11:06:01

标签: java

我正在尝试压缩两个文件夹,每个文件夹都有一些文本文件。现在我想要将2个文件夹压缩为一个文件夹及其各自的文件。

我尝试编码,但zip存在一些问题。

  

Zip包含多个文件夹。

以下是代码:

package com.test;

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 ZipFolders
{
    public static void main(String[] args) throws IOException
    {    
        List<String> listOfDir = new ArrayList<String>();

        String dirpath1 = "/home/administrator/Documents/ZipTest/folder1";
        String dirpath2 = "/home/administrator/Documents/ZipTest/folder2";

        String ZipName = "/home/administrator/Documents/ZipTest/output.zip";
        listOfDir.add(dirpath1);
        listOfDir.add(dirpath2);

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(ZipName));
        zipDirectories(listOfDir,zos); 
        zos.close(); 
        System.out.println("Zip Created Successfully");
    }

    private static void zipDirectories(List<String> listOfDir, ZipOutputStream zos) {
        for(String dirPath:listOfDir){
            try {
                zipdirectory(dirPath, zos);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void zipdirectory(String dirpath, ZipOutputStream zos) throws IOException
    {
        File f = new File(dirpath);
        String[] flist = f.list();
        for(int i=0; i<flist.length; i++)
        {
            File ff = new File(f,flist[i]);
            if(ff.isDirectory())
            {
                zipdirectory(ff.getPath(),zos);    
                continue;
            }
            String filepath = ff.getPath();
            ZipEntry entries = new ZipEntry(filepath);
            zos.putNextEntry(entries);
            FileInputStream fis = new FileInputStream(ff);
            int buffersize = 1024;
            byte[] buffer = new byte[buffersize];
            int count;
            while((count = fis.read(buffer)) != -1)
            {
                zos.write(buffer,0,count);    
            }
            fis.close();
        }
    }
}

但我得到的输出并不像预期的那样我得到了文件夹1&amp;文件夹2 喜欢 output.zip//home/administrator/Documents/ZipTest/然后在这里我们有了folder1&amp;文件夹2。

我的预期输出是: - 在zip中只有两个文件夹应该与文件一起存在。

3 个答案:

答案 0 :(得分:1)

您的zipdirectory方法在这里递归使用:

if(ff.isDirectory())
{
     zipdirectory(ff.getPath(),zos);    
     continue;
}

即创建您看到的所有文件夹。

答案 1 :(得分:0)

你需要在每个文件/目录的路径和zip条目的路径之间取消:

private static void zipDirectories(List<String> listOfDir, ZipOutputStream zos) {
    for(String dirPath:listOfDir){
        try {
            File dir = new File(dirPath);
            zipdirectory(dir, dir.getName(), zos);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public static void zipdirectory(File dir, String dirpath,
        ZipOutputStream zos) throws IOException
{
    String[] flist = dir.list();
    for(int i=0; i<flist.length; i++)
    {
        String fn = flist[i];
        String fp = dirpath == null || dirpath.isEmpty()
                ? fn : dirpath + "/" + fn;
        File ff = new File(dir, fn);
        if(ff.isDirectory())
        {
            zipdirectory(ff, fp,zos);
            continue;
        }
        ZipEntry entries = new ZipEntry(fp);
        zos.putNextEntry(entries);
        FileInputStream fis = new FileInputStream(ff);
        int buffersize = 1024;
        byte[] buffer = new byte[buffersize];
        int count;
        while((count = fis.read(buffer)) != -1)
        {
            zos.write(buffer,0,count);    
        }
        fis.close();
    }
}

答案 2 :(得分:0)

复制,粘贴代码并运行结果: -

   package com.test;

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 ZipFolders
{
    public static void main(String[] args) throws IOException
    {    
        List<String> listOfDir = new ArrayList<String>();

        String dirpath1 = "/home/administrator/Documents/ZipTest/folder1";
        String dirpath2 = "/home/administrator/Documents/ZipTest/folder2";

        String ZipName = "/home/administrator/Documents/ZipTest/output.zip";
        listOfDir.add(dirpath1);
        listOfDir.add(dirpath2);

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(ZipName));
        zipDirectories(listOfDir,zos); 
        zos.close(); 
        System.out.println("Zip Created Successfully");
    }

    private static void zipDirectories(List<String> listOfDir, ZipOutputStream zos) {
        for(String dirPath:listOfDir){
            try {
                zipdirectory(dirPath, zos);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void zipdirectory(String dirpath, ZipOutputStream zos) throws IOException
    {
        File f = new File(dirpath);
        String[] flist = f.list();
        for(int i=0; i<flist.length; i++)
        {
            File ff = new File(f,flist[i]);
            if(ff.isDirectory())
            {
                zipdirectory(ff.getPath(),zos);    
                continue;
            }
            String fileName = ff.getPath().substring(ff.getPath().lastIndexOf('/'));

            String folder = dirpath.substring(dirpath.lastIndexOf('/')+1);

            ZipEntry entries = new ZipEntry(folder+fileName);
            zos.putNextEntry(entries);
            FileInputStream fis = new FileInputStream(ff);
            int buffersize = 1024;
            byte[] buffer = new byte[buffersize];
            int count;
            while((count = fis.read(buffer)) != -1)
            {
                zos.write(buffer,0,count);    
            }
            fis.close();
        }
    }
}
相关问题