以下のコード/クラスを使用して、大量/サイズのファイルを分割して圧縮しています。私はこのクラスを以下でテストしました
- 非圧縮ファイルの数:116
- 合計サイズ(非圧縮):29.1 GB
- ZIPファイルのサイズ制限(それぞれ):3 GB [MAX_ZIP_SIZE]
- 合計サイズ(圧縮):7.85 GB
- ZIPファイルの数(MAX_ZIP_SIZEとして指定):3
MAX_ZIP_SIZEの値を16(MB)1024 1024 = 16777216-22(zipヘッダーサイズ)= 16777194に変更する必要があります。
私のコードでは、MAX_ZIP_SIZEを3 GBに設定しています(ZIPにはさまざまな点で4 GBの制限があります)。
最終的な長いMAX_ZIP_SIZE=3221225472L; // 3 GB
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";
}
}
私はそれを処理するためにすべての例外メッセージを文字列として返しました。これはプロジェクトに関連する私自身のケースです。