我正在使用Java的ZipOutputStream類寫入一個大的zip文件。Java ZipOutputStream寫入一些文件,但不寫入其他文件
當壓縮文件只有1000個子文件和子文件夾時,它工作正常。 當壓縮文件只有10000個子文件和子文件夾時,它也可以正常工作。
但是,由於某些原因,當我將其升級到超過100000個子文件和子文件夾時,就會出現問題。
它仍然會寫入大量的子文件,但它會退出。我最終得到一個zip文件,其中包含我期望的大約一半的目錄樹。
壓縮文件沒有達到4GB的屋頂大小。完成後,zip文件整體只有大約30MB。 zip文件中的每個子文件的大小都小於1KB。
zip文件的佈局很簡單:
根文件夾應該坐一個子目錄。
這些子目錄中的每一個都應該包含十個子目錄。
這一直持續到第四級,其中每個子目錄包含10個文件。
但執行後,第一級只能保存5個目錄,第一級的最後一個目錄只保存兩個子目錄。
下面是相關代碼:
public class MyZipFile{
MyFolder folder;
public void create(String[] haystack){
folder = new MyFolder();
folder.create(haystack);
}
public void writeToDisk(String rootPath){
FileOutputStream rootFile;
BufferedOutputStream rootBuffer;
ZipOutputStream rootZip;
try{
rootFile = new FileOutputStream(rootPath);
rootBuffer = new BufferedOutputStream(rootFile);
rootZip = new ZipOutputStream(rootBuffer);
folder.writeToDisk(rootZip);
rootZip.close();
}
}
}
而且
public class MyKeyFolder extends MyFileSystemElement {
private final int numSubfiles = 10;
private MyFileSystemElement[] subfiles;
public MyFolder(int[] catalogNumber){
super(catalogNumber);
subfiles = new MyFileSystemElement[numSubfiles];
}
@Override
public void create(String[] haystack){
for(int i=0; i < numSubfiles; i++){
MyFileSystemElement element;
int[] subCatalogNumber = createSubCatalogNumber(i);
//finalFolderLevel determines how many files are in the ZIP
//When finalFolderLevel is 2, there are about 1000 subfiles.
//When finalFolderLevel is 3, there are about 10000 subfiles.
//When finalFolderLevel is 4, there are about 100000 subfiles
//(and this is where I run into trouble).
if(thisFolderLevel <= finalFolderLevel)
element = new myFolder(subCatalogNumber);
else
element = new myFile(subCatalogNumber);
subfiles[i] = element;
subfiles[i].create(haystack);
}
}
@Override
public void writeToDisk(ZipOutputStream zipStream) throws IOException {
String path = createPathFromCatalogNumber();
zipStream.putNextEntry(new ZipEntry(path));
zipStream.flush();
zipStream.closeEntry();
for(MyFileSystemElement file : subfiles){
file.writeToDisk(zipStream);
}
}
}
而且
public class MyFile extends MyFileSystemElement {
private String fileContents;
@Override
public void create(String[] haystack){
fileContents = "";
fileContents += haystack[deriveIndex(0)] + "\n";
fileContents += haystack[deriveIndex(1)] + "\n";
fileContents += haystack[deriveIndex(2)] + "\n";
fileContents += haystack[deriveIndex(3)] + "\n";
fileContents += haystack[deriveIndex(4)] + "\n";
fileContents += haystack[deriveIndex(5)] + "\n";
fileContents += haystack[deriveIndex(6)] + "\n";
fileContents += haystack[deriveIndex(7)] + "\n";
fileContents += haystack[deriveIndex(8)] + "\n";
fileContents += haystack[deriveIndex(9)] + "\n";
}
@Override
public void writeToDisk(ZipOutputStream zipStream) throws IOException {
String path = createPathFromCatalogNumber();
ZipEntry entry = new ZipEntry(path);
byte[] contents = fileContents.getBytes();
zipStream.putNextEntry(entry);
zipStream.write(contents);
zipStream.flush();
zipStream.closeEntry();
}
}
我想知道如果ZipOutputStream有它前,可以寫入文件的最大數量只是退出。或者也許FileOutputStream呢。我不確定。
您的幫助表示讚賞。謝謝。
@PickenChoose它看起來像你正在觸及我在這裏描述的INFO-ZIP限制嗎?如果是這樣接受並讚揚:) –
謝謝。這解釋了一切。我試圖提出你的評論,但它表示我需要贏得15美元的聲望,然後我的選票纔會公開展示。抱歉。 – PickenChoose