为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用支持 Zip64 的 ScatterZipOutputStream 实现并行 Zip 创建?

如何使用支持 Zip64 的 ScatterZipOutputStream 实现并行 Zip 创建?

慕雪6442864 2022-06-15 09:38:45
我想知道是否有人可以帮助使用 ScatterZipOutputStream 实现并行 Zip 创建。我进行了很多搜索,但没有在哪里找到相同的示例。https://commons.apache.org/proper/commons-compress/zip.html我尝试使用 ZipArchiveOutputStream 制作 Zip、压缩目录等。现在,我正在尝试并行执行此操作。public static void makeZip(String filename) throws IOException,        ArchiveException {    File sourceFile = new File(filename);    final OutputStream out = new FileOutputStream(filename.substring(0, filename.lastIndexOf('.')) + ".zip");    ZipArchiveOutputStream os = new ZipArchiveOutputStream(out);    os.setUseZip64(Zip64Mode.AsNeeded);    os.putArchiveEntry(new ZipArchiveEntry(sourceFile.getName()));    IOUtils.copy(new FileInputStream(sourceFile), os);    os.closeArchiveEntry();    os.close();}它应该能够将单个文件作为线程处理,然后将其组合以编写结果 zip。
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

以下是zipand的工作代码unzip:

1. 更改sourceFolderand的路径zipFilePath

2. 仅压缩 *.text 类型的文件,它可以是任何类型或所有文件

3. 解压缩文件位于sourceFolder/unzip/


在 build.gradle 或 pom.xml 中导入以下依赖项


implementation("org.apache.commons:commons-compress:1.18")

implementation("commons-io:commons-io:2.6")

参考:https ://mvnrepository.com/artifact/org.apache.commons/commons-compress/1.18 https://mvnrepository.com/artifact/commons-io/commons-io/2.6


//代码


import org.apache.commons.compress.archivers.zip.*;

import org.apache.commons.compress.parallel.InputStreamSupplier;

import org.apache.commons.io.FileUtils;


import java.io.*;

import java.nio.file.Files;

import java.util.Iterator;

import java.util.zip.ZipEntry;

import java.util.zip.ZipInputStream;


public class ZipMain {


static ParallelScatterZipCreator scatterZipCreator = new ParallelScatterZipCreator();

static ScatterZipOutputStream dirs;


static {

    try {

        dirs = ScatterZipOutputStream.fileBased(File.createTempFile("java-zip-dirs", "tmp"));

    } catch (IOException e) {

        e.printStackTrace();

    }

}


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

    String sourceFolder = "/Users/<user>/Desktop/";

    String zipFilePath = "/Users/<user>/Desktop/Desk.zip";

    String fileTypesToBeAddedToZip = "txt";

    zip(sourceFolder, zipFilePath, fileTypesToBeAddedToZip);

    unzip(zipFilePath, sourceFolder + "/unzip/");

}


private static void zip(String sourceFolder, String zipFilePath, String fileTypesToBeAddedToZip) throws IOException {

    OutputStream outputStream = null;

    ZipArchiveOutputStream zipArchiveOutputStream = null;

    try {


        File srcFolder = new File(sourceFolder);

        if (srcFolder.isDirectory()) {

            // uncomment following code if you want to add all files under srcFolder

            //Iterator<File> fileIterator = Arrays.asList(srcFolder.listFiles()).iterator();

            Iterator<File> fileIterator = FileUtils.iterateFiles(srcFolder, new String[]{fileTypesToBeAddedToZip}, true);


            File zipFile = new File(zipFilePath);

            zipFile.delete();

            outputStream = new FileOutputStream(zipFile);


            zipArchiveOutputStream = new ZipArchiveOutputStream(outputStream);

            zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);


            int srcFolderLength = srcFolder.getAbsolutePath().length() + 1;  // +1 to remove the last file separator


            while (fileIterator.hasNext()) {

                File file = fileIterator.next();


                // uncomment following code if you want to add all files under srcFolder

                //if (file.isDirectory()) {

                //        continue;

                //    }


                String relativePath = file.getAbsolutePath().substring(srcFolderLength);



                InputStreamSupplier streamSupplier = () -> {

                    InputStream is = null;

                    try {

                        is = Files.newInputStream(file.toPath());

                    } catch (IOException e) {

                        e.printStackTrace();

                    }

                    return is;

                };

                ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(relativePath);

                zipArchiveEntry.setMethod(ZipEntry.DEFLATED);

                scatterZipCreator.addArchiveEntry(zipArchiveEntry, streamSupplier);

            }

            scatterZipCreator.writeTo(zipArchiveOutputStream);

            }

            if (zipArchiveOutputStream != null) {

                zipArchiveOutputStream.close();

            }

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        if (outputStream != null) {

            outputStream.close();

        }

    }

}


private static void unzip(String zipFilePath, String destDir) {

    File dir = new File(destDir);

    // create output directory if it doesn't exist

    if (!dir.exists()) {

        dir.mkdirs();

    } else {

        dir.delete();

    }


    FileInputStream fis;

    //buffer for read and write data to file

    byte[] buffer = new byte[1024];

    try {

        fis = new FileInputStream(zipFilePath);

        ZipInputStream zis = new ZipInputStream(fis);

        ZipEntry ze = zis.getNextEntry();

        while (ze != null) {

            String fileName = ze.getName();


            File newFile = new File(destDir + File.separator + fileName);


            System.out.println("Unzipping to " + newFile.getAbsolutePath());


            //create directories for sub directories in zip

            String parentFolder = newFile.getParent();

            File folder = new File(parentFolder);

            folder.mkdirs();


            FileOutputStream fos = new FileOutputStream(newFile);

            int len;

            while ((len = zis.read(buffer)) > 0) {

                fos.write(buffer, 0, len);

            }

            fos.close();

            //close this ZipEntry

            zis.closeEntry();

            ze = zis.getNextEntry();

        }

        //close last ZipEntry

        zis.closeEntry();

        zis.close();

        fis.close();

    } catch (IOException e) {

        e.printStackTrace();

    }


}

}


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信