使用Java ParallelScatterZipCreator快速压缩文件夹 [英] Fast zipping folder using java ParallelScatterZipCreator

查看:882
本文介绍了使用Java ParallelScatterZipCreator快速压缩文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

InputStreamSupplier的值或应初始化什么? 我试图将所有文件压缩到一个目录中,这应该很快. 所以多线程是我要选择的选项.

What should be the value of or initialize InputStreamSupplier? I was trying to zip all the files in a directory and that should be fast. So multi threading is the option i'm going for.

public class ScatterSample { 

    ParallelScatterZipCreator scatterZipCreator = new ParallelScatterZipCreator(); 
    ScatterZipOutputStream dirs = ScatterZipOutputStream.fileBased(File.createTempFile("scatter-dirs", "tmp")); 

    public ScatterSample() throws IOException { 
    } 

    public void addEntry(ZipArchiveEntry zipArchiveEntry, InputStreamSupplier streamSupplier) throws IOException { 
        if (zipArchiveEntry.isDirectory() && !zipArchiveEntry.isUnixSymlink()) 
            dirs.addArchiveEntry(ZipArchiveEntryRequest.createZipArchiveEntryRequest(zipArchiveEntry, streamSupplier)); 
        else 
            scatterZipCreator.addArchiveEntry( zipArchiveEntry, streamSupplier); 
    } 

    public void writeTo(ZipArchiveOutputStream zipArchiveOutputStream) 
            throws IOException, ExecutionException, InterruptedException { 
        dirs.writeTo(zipArchiveOutputStream); 
        dirs.close(); 
        scatterZipCreator.writeTo(zipArchiveOutputStream); 
    } 

}

FirstMain类:

FirstMain Class:

public class FirstMain {

    public FirstMain() {
        // TODO Auto-generated constructor stub
    }

    public static void compressFolder(String sourceFolder, String absoluteZipfilepath)
    {
        try
        {
            ScatterSample scatterSample=new ScatterSample();


            File srcFolder = new File(sourceFolder);
            if(srcFolder != null && srcFolder.isDirectory())
            {
                Iterator<File> i = FileUtils.iterateFiles(srcFolder, new String []{"pdf"}, true);


                File zipFile = new File(absoluteZipfilepath);

                OutputStream outputStream = new FileOutputStream(zipFile);

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

                while(i.hasNext())
                {
                    File file = i.next();                   
                    String relativePath  = file.getAbsolutePath().substring(srcFolderLength);



                    InputStreamSupplier streamSupplier=new InputStreamSupplier(){

                        @Override
                        public InputStream get() {
                            // TODO Auto-generated method stub
                            return null;
                        }
                    }; 

                    ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(relativePath);
                    scatterSample.addEntry(zipArchiveEntry, streamSupplier);


                }


                scatterSample.writeTo(zipArchiveOutputStream);

            }
        }catch (Exception e) {
            e.printStackTrace();
        }         
    }
     public static void main( String[] args )
     {
         compressFolder("C:\\Users\\akatm\\Desktop\\Stuff\\zipdata\\Newtry\\","C:/Users/akatm/Desktop/Stuff/Newtry.zip");
     }

}

推荐答案

您需要在ZipEntry中设置compress方法

You need to set the compress method in the ZipEntry

ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(relativePath);
zipArchiveEntry.setMethod(ZipArchiveEntry.STORED);
scatterSample.addEntry(zipArchiveEntry, streamSupplier);

如果未设置compress方法,则该方法将引发异常.

if you don't set the compress method, the method throws an exception.

这篇关于使用Java ParallelScatterZipCreator快速压缩文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆