文件压缩(文件夹中有文件夹)

有个朋友在我之前写的一个压缩文件里问:我这边是一个文件夹下面还有多个文件夹,像这样的怎么处理?

对于这样的问题我想到的是递归方式,为一级文件夹下面的每个文件进行判断是文件夹还是文件!

下面是详细的代码:

这里写图片描述

下面我们要对上面的情况进行压缩,代码如下:

    public static void main(String[] args) throws Exception {

        String entry = "C:\\Users\\yutao\\Desktop\\pageage\\test";//需要压缩的文件目录
        File file = new File(entry);

        ZipOutputStream zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath() + ".zip")));

        String base = file.getName();

        compressZip(zipOutput, file, base);
        zipOutput.closeEntry();
        zipOutput.close();
    }

    /**
    * 因为子文件夹中可能还有文件夹,所以进行递归
    *
    */
    private static void compressZip(ZipOutputStream zipOutput, File file, String base) throws IOException {

        if(file.isDirectory()){
            File[] listFiles = file.listFiles();// 列出所有的文件

            for(File fi : listFiles){
                if(fi.isDirectory()){
                    compressZip(zipOutput, fi, base + "/" + fi.getName());
                }else{
                    zip(zipOutput, fi, base);
                }
            }
        }else{
            zip(zipOutput, file, base);
        }
    }

    /**
    * 压缩的具体操作
    *
    */
    public static void zip(ZipOutputStream zipOutput, File file, String base) throws IOException, FileNotFoundException {
        ZipEntry zEntry = new ZipEntry(base + File.separator + file.getName());
        zipOutput.putNextEntry(zEntry);

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

        byte[] buffer = new byte[1024];
        int read = 0;
        while((read =bis.read(buffer)) != -1){
            zipOutput.write(buffer, 0, read);
        }
        bis.close();
    }

重点:

ZipEntry其实就是即将要压缩文件的文件信息。 
假设我们即将要压缩的是ggindex.jar文件,路径是根路径。 
那么我们就要在ZipEntry对象中设置好。

ZipEntry zEntry = new ZipEntry(base + File.separator + file.getName());
zipOutput.putNextEntry(zEntry);

//根据上述的假设,我们就要这样写
ZipEntry zEntry = new ZipEntry("ggindex.jar");
zipOutput.putNextEntry(zEntry);//将其添加到压缩包中,准备进行压缩啦。

这里还要注意,ZipEntry参数base + File.separator + file.getName()是为了产生下面这样的效果。否则所有的文件都将会在根路径中。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012768459/article/details/79974402