Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建具有最大文件大小限制的java zip存档_Java_Zip - Fatal编程技术网

如何创建具有最大文件大小限制的java zip存档

如何创建具有最大文件大小限制的java zip存档,java,zip,Java,Zip,我需要用java编写一个算法(适用于android应用程序)来读取包含更多文件夹的文件夹以及包含图像和音频文件的文件夹,因此结构如下:mainDir/categorySubfolder/myFile1.jpg 我的问题是,我需要将归档文件的大小限制为16mb,并在运行时创建所需数量的归档文件,以包含我的主mainDir文件夹中的所有文件 我尝试了网络上的几个例子,并且阅读了java文档,但是我无法理解并按照我需要的方式将它们放在一起。以前有人这样做过吗,或者给我一个链接或者一个例子 我用递归方法

我需要用java编写一个算法(适用于android应用程序)来读取包含更多文件夹的文件夹以及包含图像和音频文件的文件夹,因此结构如下:
mainDir/categorySubfolder/myFile1.jpg

我的问题是,我需要将归档文件的大小限制为16mb,并在运行时创建所需数量的归档文件,以包含我的主
mainDir
文件夹中的所有文件

我尝试了网络上的几个例子,并且阅读了java文档,但是我无法理解并按照我需要的方式将它们放在一起。以前有人这样做过吗,或者给我一个链接或者一个例子

我用递归方法解决了文件的读取问题,但我无法编写zip创建的逻辑

我愿意接受建议或更好的工作示例。

据我所知,我只是建议跟踪到目前为止的存档大小,当它接近某个任意值(应该低于最大值)时,它将决定启动一个新文件。因此,对于16MB的限制,您可以将该值设置为10MB,并在达到该值时启动一个新的zip,但如果达到9MB,并且下一个文件压缩到8MB,则最终的zip将超过您的限制

在那篇文章中给出的代码似乎对我不起作用,因为1)它在ZipEntry创建之前就有了大小,所以它总是0,2)它没有写出任何zip:-)如果我搞错了,请告诉我

以下内容适合我。为简单起见,我将其从包装器中取出,并将其全部放在main中(stringargs[])。有很多很多方法可以改进此代码:-)

是一个很好的库,可以创建多部分zip文件

net.lingala.zip4j.core.ZipFile zipFile = new ZipFile("out.zip");
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipFile.createZipFileFromFolder("path/to/source/dir", parameters, true, maximum size);

你可以在他们的网站上找到更多的例子

我使用下面的代码/类来拆分和压缩大量/大小的文件。 我在下面测试了这门课

  • 未压缩文件数:116
  • 总大小(未压缩):29.1 GB
  • 压缩文件大小限制(每个):3 GB[最大压缩大小]
  • 总大小(压缩):7.85 GB
  • 压缩文件的数量(拆分为最大压缩大小):3
您必须将MAX_ZIP_SIZE的值更改为16(MB)10241024=16777216-22(ZIP头大小)=16777194
在我的代码中,MAX_ZIP_SIZE设置为3 GB()

最终最大长拉链尺寸=322225472L//3 GB

我已将所有异常消息作为字符串返回以使用它。这 我自己的案子和这个项目有关


你在网上试过的例子有哪些?当你尝试它们时发生了什么?这是我最初的帖子,有一个错误我现在改正了,但现在又出现了两个错误。。。。第一个问题是,我似乎无法设置ZipEntry的大小,第二个问题是,当我尝试提取文件时,我得到错误“compression method not supported”(压缩方法不受支持),也因为我无法设置ZipEntry的大小,我的逻辑不起作用,所以它总是只创建一个档案完整的zip文件有多大?它可以存储在磁盘上,甚至可以保存在内存中吗?可能的副本我一定会尝试一下:)是的,你是对的。我从示例代码中得到了相同的行为。我会带着我的结果回来的:D谢谢你谢谢,我对你的代码做了一些小的修改以达到我想要的结果DNo问题,您必须更改什么?我在ZipOutputStream和FileOutputStream之间添加了一个BufferedOutputStream,如下所示:FileOutputStream dest=new FileOutputStream(_zipDirectory+“/zip.part”+I+“.zip”);ZipOutputStream out=新的zipoutpstream(新的缓冲输出流(dest));你能告诉我,对于上面的zip文件,解压函数是什么样子的吗?
net.lingala.zip4j.core.ZipFile zipFile = new ZipFile("out.zip");
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipFile.createZipFileFromFolder("path/to/source/dir", parameters, true, maximum size);
package com.company;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class QdeZip {

    public static String createZIP(String directoryPath, String zipFileName, String filesToZip) {
        try {
            final int BUFFER = 104857600; // 100MB
            final long MAX_ZIP_SIZE = 3221225472L; //3 GB
            long currentSize = 0;
            int zipSplitCount = 0;
            String files[] = filesToZip.split(",");
            if (!directoryPath.endsWith("/")) {
                directoryPath = directoryPath + "/";
            }
            byte fileRAW[] = new byte[BUFFER];
            ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(directoryPath + zipFileName.toUpperCase()));
            ZipEntry zipEntry;
            FileInputStream entryFile;
            for (String aFile : files) {
                zipEntry = new ZipEntry(aFile);
                if (currentSize >= MAX_ZIP_SIZE) {
                    zipSplitCount++;
                    //zipOut.closeEntry();
                    zipOut.close();
                    zipOut = new ZipOutputStream(new FileOutputStream(directoryPath + zipFileName.toLowerCase().replace(".zip", "_" + zipSplitCount + ".zip").toUpperCase()));
                    currentSize = 0;
                }
                zipOut.putNextEntry(zipEntry);
                entryFile = new FileInputStream(directoryPath + aFile);

                int count;
                while ((count = entryFile.read(fileRAW, 0, BUFFER)) != -1) {
                    zipOut.write(fileRAW, 0, count);

                    //System.out.println("number of Bytes read = " + count);
                }
                entryFile.close();
                zipOut.closeEntry();
                currentSize += zipEntry.getCompressedSize();
            }

            zipOut.close();
            //System.out.println(directory + " -" + zipFileName + " -Number of Files = " + files.length);
        } catch (FileNotFoundException e) {
            return "FileNotFoundException = " + e.getMessage();
        } catch (IOException e) {
            return "IOException = " + e.getMessage();
        } catch (Exception e) {
            return "Exception = " + e.getMessage();
        }

        return "1";
    }
}