0

我正在使用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呢。我不確定。

您的幫助表示讚賞。謝謝。

回答

0

原始INFO-ZIP格式(哪個Java實現)似乎限於65,536條目:

http://www.info-zip.org/FAQ.html#limits

下面是從相對於它們的ZIP64格式的WinZIP該限制另一個角度:

http://kb.winzip.com/kb/entry/99/

您可能想要使用不同的存檔格式或找出限制文件數量的方法。

+0

@PickenChoose它看起來像你正在觸及我在這裏描述的INFO-ZIP限制嗎?如果是這樣接受並讚揚:) –

+0

謝謝。這解釋了一切。我試圖提出你的評論,但它表示我需要贏得15美元的聲望,然後我的選票纔會公開展示。抱歉。 – PickenChoose