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