java.util.zip.ZipOutputStream-快速压缩大型文件?

java.util.zip.ZipOutputStream-快速压缩大型文件?,java,android,zip,buffer,large-files,Java,Android,Zip,Buffer,Large Files,我想知道如何在我的android应用程序中加速40多个图像文件的压缩过程 客户端正在发送图像,在上传到服务器之前,需要将图像压缩或放入文件夹中。现在我使用下面的方法,但这样文件压缩只需20-30秒,而手机似乎被冻结,用户倾向于退出应用程序:( 我用于压缩的方法: private static final int BUFFER_SIZE = 2048; public void zip(String[] files, String zipFile) throws IOException {

我想知道如何在我的android应用程序中加速40多个图像文件的压缩过程

客户端正在发送图像,在上传到服务器之前,需要将图像压缩或放入文件夹中。现在我使用下面的方法,但这样文件压缩只需20-30秒,而手机似乎被冻结,用户倾向于退出应用程序:(

我用于压缩的方法:

private static final int BUFFER_SIZE = 2048;

public void zip(String[] files, String zipFile) throws IOException {
        File zipDirectory = new File(Environment.getExternalStorageDirectory()
                + "/laborator/");
        if (!zipDirectory.exists()) {
            zipDirectory.mkdirs();
        } else {
            System.out.println("folder already exists!");
        }

        BufferedInputStream origin = null;
        ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
                new FileOutputStream(Environment.getExternalStorageDirectory()
                        + "/laborator/" + zipFile)));
        try {
            byte data[] = new byte[BUFFER_SIZE];

            for (int i = 0; i < files.length; i++) {
                FileInputStream fi = new FileInputStream(files[i]);
                origin = new BufferedInputStream(fi, BUFFER_SIZE);
                try {
                    ZipEntry entry = new ZipEntry(files[i].substring(files[i]
                            .lastIndexOf("/") + 1));
                    out.putNextEntry(entry);
                    int count;
                    while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
                        out.write(data, 0, count);
                    }
                } finally {
                    origin.close();
                }
            }
        } finally {
            out.close();
            System.out.println("ziping done");
            sendZip();
        }
    }
private static final int BUFFER_SIZE=2048;
公共void zip(字符串[]文件,字符串zipFile)引发IOException{
File zipddirectory=新文件(Environment.getExternalStorageDirectory())
+“/laborator/”;
如果(!zipDirectory.exists()){
zipDirectory.mkdirs();
}否则{
System.out.println(“文件夹已存在!”);
}
BufferedInputStream原点=null;
ZipOutputStream out=新ZipOutputStream(新缓冲输出流(
新的FileOutputStream(Environment.getExternalStorageDirectory()
+“/laborator/”+zipFile));
试一试{
字节数据[]=新字节[缓冲区大小];
对于(int i=0;i
由于您的图像是JPG格式的,因此您很可能无法在ZIP文件中获得任何适当的压缩。因此,您可以尝试将未压缩的图像放入ZIP文件,这样在不增加ZIP文件大小的情况下,压缩速度应该会大大加快:

ZipEntry entry = new ZipEntry(files[i].subs...
entry.setMethod(ZipEntry.STORED);
out.putNextEntry(entry);
你可以用

out.setLevel(Deflater.NO_COMPRESSION);

这样就不需要更改ZipEntry。

你有什么图像类型:jpg、GIF、PNG等?@wero这些文件都是jpg.Thaaankkss!还有一个问题,如果我调整大小并逐个上传每个文件,会怎么样?我遇到过zips损坏的情况,或者当outOfMemory出现时,这样就不会出现任何错误。但是Uploa一个接一个会更安全,你觉得怎么样?谢谢!发送一个文件可能比发送40个不同的文件快,除非它不需要考虑。有很多事情要考虑,但最终它的权衡取决于你的应用程序。为什么不去执行一个策略——当它真的不起作用时,寻找ALTE。R活动。问题是,这已经是一个生产应用程序。我在过去几天中遇到的问题:1.损坏的zip,2.缺少存档中的图像,3.完全缺少服务器中的存档:(仅在某些情况下。为什么不起草另一个问题来解决这些问题?评论是一个不好讨论的地方。请记住,如果使用ZipEntry.storage,还必须手动设置ZipEntry的CRC和大小。