0

Java の ZipOutputStream クラスを使用して、大きな zip ファイルを作成しています。

zip ファイルに 1000 個のサブファイルとサブフォルダーしかない場合は問題なく動作します。zip ファイルに 10000 個のサブファイルとサブフォルダーしかない場合にも問題なく動作します。

しかし、何らかの理由で、100000 を超えるサブファイルとサブフォルダーに増やすと、問題が発生し始めます。

それでもサブファイルの大きなチャンクを書き込みますが、その後終了します。最終的に、予想していたディレクトリ ツリーの約半分を含む zip ファイルが作成されます。

zip ファイルは 4GB の上限サイズに達していません。終了後、zip ファイルは全体で約 30MB しかありません。zip ファイル内の各サブファイルのサイズは 1KB 未満です。

zip ファイルのレイアウトは単純です。

ルート フォルダには 10 個のサブディレクトリが必要です。

これらの各サブディレクトリには、10 個のサブディレクトリが含まれている必要があります。

これは、各サブディレクトリが 10 個のファイルを保持する第 4 レベルまで続きます。

ただし、実行後、最初のレベルには 5 つのディレクトリしか保持されず、最初のレベルの最後のディレクトリには 2 つのサブディレクトリしか保持されません。

関連するコードは次のとおりです。

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 がそうするかもしれません。わからない。

あなたの助けに感謝します。ありがとうございました。

4

1 に答える 1

0

元の INFO-ZIP 形式 (Java が実装) は、65,536 エントリに制限されているようです。

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

ZIP64 形式に関連する WinZIP からのその制限に関する別の角度を次に示します。

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

別のアーカイブ形式を使用するか、ファイル数を制限する方法を見つけたい場合があります。

于 2015-11-15T02:48:14.313 に答える